刚尝试在真实设备上测试我的应用程序(HTC Desire Z with Android 2.2).并发现我的上下文菜单在EditTexts上根本不起作用.否则上下文菜单有效:在ListView,ImageView等中.在模拟器上一切正常……

当我点击EditText时,它显示缩放框架之类的内容,然后显示异常(不是标准的Android)上下文菜单,其中显示:“选择文本”,“全选”.它不显示我的菜单.
以下是截图:

> Before tap
> During tap
> After tap(只需普通选择文字,全选,粘贴)

但没有像我在模拟器中的菜单 – look here

这是我活动的源代码:

public class MyActivity extends Activity
{
    private static final String TAG=MyActivity.class.getName();

    EditText editText;
    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        editText=(EditText )findViewById(R.id.editText);
        this.registerForContextMenu(editText);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu,View view,ContextMenu.ContextMenuInfo menuInfo)
    {
        Log.v(TAG,"Creating context menu for view="+view);
        menu.add(Menu.NONE,Menu.FirsT+1,Menu.NONE,"Test menu");
        super.onCreateContextMenu(menu,view,menuInfo);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item)
    {
        Log.v(TAG,"Context item selected as="+item.toString());
        return super.onContextItemSelected(item);
    }
}

我已经彻底调试/记录了我的代码周围的一切,但仍然没有调用Activity.onCreateContextMenu()(虽然它以正确的方式注册).

请帮忙 – 它可以是什么?它与HTC的特点有关吗?

解决方法

是的,我认为你看到的是一个HTC菜单.

我相信,您看到的图形编辑上下文菜单是最新的Desire模型(Desire HD和Desire Z)的新功能.我在原始Desire上看到的(带有您的代码)是一个弹出基于文本的菜单,其中HeaderTitle设置为“编辑文本”,列表如“全选”,“复制”,“粘贴”等.但是,我还看到一个条目“测试菜单”.

我发现当为ListView和ImageView之类的东西调用onCreateContextMenu()时,默认情况下不会预先填充传入该调用的’menu’对象.然而,在关闭EditText的情况下,它被设计为与剪贴板交互,因此系统基于EditText的内容状态提供预先填充的菜单(例如,如果选择了文本,则提供’复制’选项;如果剪贴板上的文字提供“粘贴”选项; ……等等).

通过修改代码清除标题和内容,我能够获得没有“编辑”选项的上下文菜单…

@Override
public void onCreateContextMenu(ContextMenu menu,ContextMenu.ContextMenuInfo menuInfo)
{
    Log.v(TAG,"Creating context menu for view="+view);

    // Clear current contents
    menu.clearHeader();
    menu.clear();

    menu.setHeaderTitle("TEST MENU");
    menu.add(Menu.NONE,"Test menu");
    super.onCreateContextMenu(menu,menuInfo);
}

您获得图形菜单(可能派生自ContextMenu)的事实表明上述技术不起作用,因此唯一的方法是实例化您自己的ContextMenu对象,而不是使用传入onCreateContextMenu()的对象.

I have thoroughly debugged/logged everything around my code,but still Activity.onCreateContextMenu() not even called

这看起来很奇怪 – 显然它正在为我调用,因为我已经能够使用传递给它的ContextMenu.

编辑1:重新考虑这一点,你提到你“点击”EditText – 你正在做什么(短暂的触摸然后用手指向上)?

为了得到我的ContextMenu,我必须使用’长’按下/点击(触摸并按住约1秒钟).当我只是点击/触摸我的EditText时,会出现“软”键盘,或者,如果键盘已经可见,则光标只会移动到EditText框中的其他位置.

显然,Desire Z有一个物理键盘,可能会导致稍微不同的行为(以及Desire Z对我的Desire有不同版本的Sense UI).

永远不会为你调用onCreateContextMenu()的事实只能意味着一件事,那就是你所看到的不是ContextMenu,而是一些其他类型的弹出UI元素.至少这是我理解它的唯一合乎逻辑的方式.

您是否可以确认“长”按仍然无法为您创建ContextMenu,或者您是否一直使用长按?

如果您尝试了长按,请尝试按如下方式修改代码…

>实现OnClickListener

public class MyActivity extends Activity
    implements OnLongClickListener {

>在onCreate中设置editText的监听器…

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    editText=(EditText )findViewById(R.id.editText);
    this.registerForContextMenu(editText);
    editText.setonLongClickListener(this); // <-- ADD THIS
}

>添加监听器代码……

@Override
public boolean onLongClick(View arg0) {
    android.util.Log.v(TAG,"onLongClick() called");
    if (arg0 == editText)
    {
        android.util.Log.v(TAG,"arg0 == editText");
            Toast.makeText(this,"onLongClick intercepted",2000).show();
        return true;
    }
    else
    {
        android.util.Log.v(TAG,"arg0 != editText");
        return false;
    }
}

通过这样做,我能够拦截长按,并通过从onLongClick()返回’true’,我向系统指示我’消耗’了该事件并且它没有被传递到原因创建我的ContextMenu.

如果这对您不起作用并且短暂敲击仍会导致弹出窗口出现,则尝试实现OnClickListener并覆盖onClick().

练习的目的是,如果您可以拦截导致创建弹出窗口的任何内容,则可以手动创建并显示自己的ContextMenu.

用于EditText的android – onCreateContextMenu()在真实设备上不起作用的更多相关文章

  1. Swift教程17-淡化MVC,使用MVVM框架开发轻巧便于维护的iOS/android app

    MVVM是微软提出一种移动开发框架,旨在针对传统的MVC框架,解决传统的MVC框架的控制器的臃肿问题.M:Model模型,也就是数据模型;比如一条微博,对应的所有字段合成一条微博整体,这个整体就是ModelV:View视图,只用来显示的视图,如iOS的UIView,Cell;当然在iOS中Storyboard中,view总是和控制器关联,这并不是严格的view如果我们纯手写代码定义一个view那么

  2. 使用 Swift 语言编写 Android 应用入门

    Swift标准库可以编译安卓armv7的内核,这使得可以在安卓移动设备上执行Swift语句代码。做梦,虽然Swift编译器可以胜任在安卓设备上编译Swift代码并运行。这需要的不仅仅是用Swift标准库编写一个APP,更多的是你需要一些框架来搭建你的应用用户界面,以上这些Swift标准库不能提供。简单来说,构建在安卓设备上使用的Swiftstdlib需要libiconv和libicu。通过命令行执行以下命令:gitclonegit@github.com:SwiftAndroid/libiconv-libi

  3. R.swift 让iOS项目像Android R 一样管理资源

    什么是R.Swift搞过的Android开发同学都知道,在Android开发中,其对于资源的引用非常方便,我们可以通过”R机制”来对Android中的图片、布局、动画配置、国际化字符串、尺寸等等资源进行非常方便快捷的引用。开妈搞iOS的时候,我瞬间觉得iOS的资源引用略为恶心,跟Android比起来,它更加蛋疼麻烦。R.Swift是一款基于Swift平台,针对iOS以及TVOS开发的仿Android资源引用框架。

  4. 如何使用“repo”克隆最小的android源码?

    我可以使用“repo”工具克隆Android源代码.但是,我想要做的是以比没有11GB足迹的更小的方式克隆源代码.它似乎下载了与每个Android设备和每个先前版本相关的内容.我试过想通过检查这样的特定分支来减少这个:然而,最终发生的事情是,我仍然只涉及一个特定的快照(可理解).但有没有办法限制克隆的数量?

  5. android – CordovaActivity无法解析为Phonegap 3.4中的类型

    嗨,我正在通过命令行界面处理PhoneGap.我能够创建一个项目,并从Windows7中的命令提示符运行Android模拟器.由于我在eclipse中将项目导入并复制到我的工作区,因此在主类中显示了一些扩展CordovaActivity的错误.错误是:我该怎么办?

  6. 如何更改android微调器popupBackground

    我试图通过设置android:popupBackground来改变android微调器弹出窗口背景,但它没有任何效果.有什么方法可以改变它吗?

  7. Android中的人脸检测,无需用户交互

    我想检测前置摄像头框架中的面部数量.使用此功能后,我可以检测到脸部:http://www.developer.com/ws/android/programming/face-detection-with-android-apis.html.但我不知道如何在没有用户互动的情况下每隔30秒使用前置摄像头捕获图像.有人可以帮帮我吗?解决方法以下代码将在每5秒钟后从相机中捕捉照片.这里,TIMER_STA

  8. 在Android上自动测试Cordova / Phonegap Webview

    这是我读完你的问题后我能想到的.所以让我们通过给定的环境进行拆分:原生iOS>单元测试–>在xCode中完成.http://www.apple.com>功能测试–>http://appium.io/原生Android>单元测试–>JUnit,http://developer.android.com/tools/testing/testing_android.html>功能测试–>http://selendroid.io/本地网络,如phonegap/cordova应用程序>单元测试–>jsunit,htt

  9. android – 是否有可能创建一个可以由非Mono开发人员使用的MonoDroid和MonoTouch的跨平台共享库?

    Android库我们可以生成一个Android库作为MonoDroid的输出,其他开发人员使用ADT和Java开发能够使用他们的应用?iOS库我们可以从MonoTouch生成一个库,ObjectiveC开发人员能够在他们的应用程序中使用吗?解决方法对于这两种情况,答案都是否定的,无法在MonoTouch或MonoforAndroid上创建非托管应用程序可以使用的托管库.这是因为托管库严重依赖托管运行时,它们不是独立库.

  10. 在Android上解码Java或C/C++中的Airplay数据包

    提前致谢马特解决方法虽然Java编译为在虚拟机中运行的字节码,但它可能不一定比本机编译的可执行文件更慢(或更快).这一切都取决于程序!在这种情况下,Java可能会变慢,原因有很多:>解码实现可能只是编码/优化不佳?(我必须在这里注意,我不是Java的专家!)但是,我仍然不会调用Java本质上比C或C慢.我相信你可以在互联网上找到many-abenchmarks和测试,比较一种语言和另一种语言,有些人声称在一定程度上(出于骄傲和自我?

随机推荐

  1. bluetooth-lowenergy – Altbeacon库无法在Android 5.0上运行

    昨天我在Nexus4上获得了Android5.0的更新,并且altbeacon库停止了检测信标.似乎在监视和测距时,didEnterRegion和didRangeBeaconsInRegion都没有被调用.即使RadiusNetworks的Locate应用程序现在表现不同,一旦检测到信标的值,它们就不再得到更新,并且通常看起来好像信标超出了范围.我注意到的一点是,现在在logcat中出现以下行“B

  2. android – react-native动态更改响应者

    我正在使用react-native进行Android开发.我有一个视图,如果用户长按,我想显示一个可以拖动的动画视图.我可以使用PanResponder实现这一点,它工作正常.但我想要做的是当用户长按时,用户应该能够继续相同的触摸/按下并拖动新显示的Animated.View.如果您熟悉Google云端硬盘应用,则它具有类似的功能.当用户长按列表中的任何项目时,它会显示可拖动的项目.用户可以直接拖

  3. android – 是否有可能通过使用与最初使用的证书不同的证书对其进行签名来发布更新的应用程序

    是否可以通过使用与最初使用的证书不同的证书进行签名来发布Android应用程序的更新?我知道当我们尝试将这样的构建上传到市场时,它通常会给出错误消息.但有没有任何出路,比如将其标记为主要版本,指定市场中的某个地方?解决方法不,你不能这样做.证书是一种工具,可确保您是首次上传应用程序的人.所以总是备份密钥库!

  4. 如何检测Android中是否存在麦克风?

    ..所以我想在让用户访问语音输入功能之前检测麦克风是否存在.如何检测设备上是否有麦克风.谢谢.解决方法AndroidAPI参考:hasSystemFeature

  5. Android – 调用GONE然后VISIBLE使视图显示在错误的位置

    我有两个视图,A和B,视图A在视图B上方.当我以编程方式将视图A设置为GONE时,它将消失,并且它正下方的视图将转到视图A的位置.但是,当我再次将相同的视图设置为VISIBLE时,它会在视图B上显示.我不希望这样.我希望视图B回到原来的位置,这是我认为会发生的事情.我怎样才能做到这一点?编辑–代码}这里是XML:解决方法您可以尝试将两个视图放在RelativeLayout中并相对于彼此设置它们的位置.

  6. android – 获得一首歌的流派

    我如何阅读与歌曲相关的流派?我可以读这首歌,但是如何抓住这首歌的流派,它存放在哪里?解决方法检查此代码:

  7. android – 使用textShadow折叠工具栏

    我有一个折叠工具栏的问题,在展开状态我想在文本下面有一个模糊的阴影,我使用这段代码:用:我可以更改textColor,它可以工作,但阴影不起作用.我为阴影尝试了很多不同的值.是否可以为折叠文本投射阴影?

  8. android – 重用arm共享库

    我已经建立了armarm共享库.我有兴趣重用一个函数.我想调用该函数并获得返回值.有可能做这样的事吗?我没有任何头文件.我试过这个Android.mk,我把libtest.so放在/jni和/libs/armeabi,/lib/armeabi中.此时我的cpp文件编译,但现在是什么?我从objdump知道它的名字编辑:我试图用这个android.mk从hello-jni示例中添加prebuild库:它工作,但libtest.so相同的代码显示以下错误(启动时)libtest.so存在于libhello-j

  9. android – 为NumberPicker捕获键盘’Done’

    我有一个AlertDialog只有一些文本,一个NumberPicker,一个OK和一个取消.(我知道,这个对话框还没有做它应该保留暂停和恢复状态的事情.)我想在软键盘或其他IME上执行“完成”操作来关闭对话框,就像按下了“OK”一样,因为只有一个小部件可以编辑.看起来处理IME“Done”的最佳方法通常是在TextView上使用setonEditorActionListener.但我没有任何Te

  10. android – 想要在调用WebChromeClient#onCreateWindow时知道目标URL

    当我点击一个带有target=“_blank”属性的超链接时,会调用WebChromeClient#onCreateWindow,但我找不到新的窗口将打开的新方法?主页url是我唯一能知道的东西?我想根据目标网址更改应用行为.任何帮助表示赞赏,谢谢!

返回
顶部