- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
刚刚尝试在真实设备(HTC Desire Z with Android 2.2)上测试我的应用程序。并发现我的上下文菜单在 EditText
上根本不起作用。否则上下文菜单有效:在 ListView
、ImageView
等中。在模拟器上一切正常......
当我点击 EditText 时,它会显示类似缩放框的内容,然后显示不寻常的(不是标准的 Android 类)上下文菜单,内容为:“选择文本”、“全选”。它不显示我的菜单。以下是屏幕截图:
但没有像模拟器中那样的菜单 - look here
这是我的 Activity 的源代码:
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() 时,默认情况下不会预先填充传递给该调用的“菜单”对象。然而,在 EditText 的情况下,它被设计为与剪贴板交互,因此系统会根据 EditText 的内容状态提供一个预填充的菜单(例如,如果选择了文本,则提供“复制”选项;如果剪贴板上有文本,请提供“粘贴”选项;...等等)。
通过修改您的代码清除标题和内容,我能够获得没有“编辑”选项的上下文菜单...
@Override
public void onCreateContextMenu(ContextMenu menu, View view, 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, Menu.FIRST+1, Menu.NONE, "Test menu");
super.onCreateContextMenu(menu, view, menuInfo);
}
您获得图形菜单(可能派生自 ContextMenu)的事实表明上述技术不起作用,因此唯一的解决方法是实例化您自己的 ContextMenu 对象,而不是使用传递给 onCreateContextMenu 的对象( ).
I have thoroughly debugged/logged everything around my code, but still Activity.onCreateContextMenu() not even called
这看起来很奇怪 - 显然它是为我调用的,因为我已经能够使用传递给它的 ContextMenu。
编辑 1: 重新考虑这一点,您提到您“点击”EditText - 这就是您实际在做的事情(短时间按下然后手指向上)?
要获得上下文菜单,我必须使用“长按”/单击(触摸并按住约 1 秒钟)。当我简单地点击/触摸我的 EditText 时,“软”键盘就会出现,或者,如果键盘已经可见,则光标会简单地移动到 EditText 框中的不同位置。
显然 Desire Z 有一个物理键盘,这可能会导致行为略有不同(以及 Desire Z 具有与我的 Desire 不同版本的 Sense UI)。
永远不会为您调用 onCreateContextMenu() 这一事实仅意味着一件事,即您看到的不是 ContextMenu,而是其他类型的弹出式 UI 元素。至少这是我能理解的唯一合乎逻辑的方式。
您能否确认“长按”仍然不会为您创建上下文菜单,或者您是否一直在使用长按?
如果你尝试过长按,那么尝试修改代码如下...
实现 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”,我向系统表明我已经“消耗”了该事件并且它没有被传递继续创建我的上下文菜单。
如果这对您不起作用并且短按仍然会导致弹出窗口出现,请尝试实现 OnClickListener 并改写 onClick()。
练习的目的是,如果您可以拦截导致您看到的弹出窗口创建的任何内容,您就可以手动创建并显示您自己的上下文菜单。
关于android - EditText 的 onCreateContextMenu() 在真实设备上不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4402820/
看起来 onCreateContextMenu 根本没有被调用。在我的 ListActivity 的 onCreate 中,我有: list = getListView(); registerForC
我正在使用以下代码生成 onCreateContextMenu,但是,在单击列表项时我没有收到任何响应。 @Override public void onCreateContextMenu(Conte
我有一个为创建上下文菜单注册 ListView 的 Activity : registerForContextMenu(getListView()); 问题是长按某些项目不应显示上下文菜单,因为这些项
我正在尝试创建一个上下文菜单,根据单击的行更改可用选项。 但在创建菜单之前,我无法弄清楚如何获取被单击行在 ListView 中的行位置。 最佳答案 一点都不明显,但这是代码: public v
怎么了?? 我正在创建一个可移动的 TextView ,所以我可以将它拖放到整个屏幕上......然后,我决定向它添加上下文菜单,所以我做到了,但是上下文菜单只有在我禁用 onTouchListene
我有一个包含多个项目的 LisView。为此,我连接了一个 OnItemClickListener(作为内部类),如下所示: lv.setOnItemClickListener(new OnItemC
刚刚尝试在真实设备(HTC Desire Z with Android 2.2)上测试我的应用程序。并发现我的上下文菜单在 EditText 上根本不起作用。否则上下文菜单有效:在 ListView、
我希望捕获用户触摸事件的坐标(为此我实现了 onTouch 方法),但我还想在用户触摸屏幕时显示上下文菜单。 当同时使用 onTouch 和 onCreateContextMenu 方法时,每个触摸事
我正在尝试使用 onCreateContextMenu 从 ListView 中复制项目文本 OnCreateContextMenu and ListView items和 Copy text fro
我尝试为我的 ListView 创建上下文菜单,但是当我“长按”列表项时,应用程序关闭并显示此跟踪: FATAL EXCEPTION: main java.lang.NullPointerExcept
我正在尝试使用上下文菜单。我已经使用 SimpleCursorAdapter 为简单的 ListActivity 成功完成了此操作。 继续我想用 CursorAdapter 替换 SimpleCurs
我遇到 onCreateContextMenu 问题,仅在 API 15 和 16 上抛出错误。它在从 API 8 到 API 17(我的最小和最大目标)的所有其他 API 上工作得很好。 我尽了最大
在 onCreate 中,我将线性布局 View 附加到变量 activeView。然后调用 registerForContextMenu(activeView)。看起来一切正常,创建了上下文菜单,可
我有一个应用程序,它对 Activity 的 fragment 有很多看法。其中许多 View 需要上下文菜单,因此我必须在 View 的 onCreateContextMenu 中而不是在 Acti
我已经分析了这里的很多帖子,但没有发现任何与我的问题非常相似的问题。 基本上,我试图在 onListItemClick 中调用 openContextMenu(l)。这样做会创建一个没有 menuIn
我是一名优秀的程序员,十分优秀!