EditText 的 onCreateContextMenu() 在真实设备上不起作用
Posted
技术标签:
【中文标题】EditText 的 onCreateContextMenu() 在真实设备上不起作用【英文标题】:onCreateContextMenu() for EditText doesn't work on real device 【发布时间】:2011-05-23 02:46:30 【问题描述】:刚刚尝试在真实设备上测试我的应用程序(HTC Desire Z 与 android 2.2)。并发现我的上下文菜单在EditText
s 上根本不起作用。否则上下文菜单有效: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 的特性有关吗?
【问题讨论】:
你能贴一张上下文菜单的截图吗? 我也很想看看你看到的截图。我有一个原始的欲望,我刚刚用我的手机试过这个,当我长按我的 EditText 时,我正确地得到了我自己的带有标题图标/标题的上下文菜单和我的选择。 一旦我可以访问启用 USB 调试的 PC,我将截取屏幕截图。我想它会在今天晚上(莫斯科/俄罗斯时间)发生 看那里 - 我已经放置了截图 + 提供的来源 (re mod-flag;这不是一个审核请求——不过,请随时通过他们的正常故障报告渠道联系 HTC 团队) 【参考方案1】:是的,我认为您看到的是 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( )。
我已经彻底调试/记录了我的代码周围的所有内容,但仍然没有调用 Activity.onCreateContextMenu()
这看起来很奇怪 - 显然它是为我调用的,因为我已经能够使用传递给它的 ContextMenu。
编辑 1: 重新考虑这一点,您提到您“点击”了 EditText - 这就是您实际在做的事情(短暂触摸然后手指向上)?
要获得我的 ContextMenu,我必须使用“长按”/单击(触摸并按住大约 1 秒钟)。当我简单地点击/触摸我的 EditText 时,会出现“软”键盘,或者,如果键盘已经可见,则光标会简单地移动到 EditText 框中的不同位置。
显然 Desire Z 有一个物理键盘,这可能会导致行为略有不同(以及 Desire Z 的 Sense UI 版本与我的 Desire 不同)。
永远不会为您调用 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。
【讨论】:
不,它不会调用 onCreateContextMenu() - 我已经仔细检查了所有内容。请帮忙!有什么想法吗? @barmaley:在我开始编辑 1 的结尾处查看我的答案: 奇怪的事情发生了......我的意思是,一旦我拦截长按并使用它 - 什么都没有 - 既不是 onCreateContextMenu 也不是 HTC 菜单。当我拦截并且不消耗长按(返回 false)时 - 我看到 onCreateContextMenu 并且没有 HTC 菜单。您能否在您的 HTC Desire 上确认它如何处理截获的长按(返回真假)? 我的意思是拦截长点击修复描述的错误,但这很不寻常。它不应该发生...... @barmaley:如果我从 onClick() 返回 'false' 则调用 onCreateContextMenu() 但如果我返回 'true' 则不是,我看不到我的 ContextMenu 这正是我会期待的。你是对的 - 如果只是听长按会阻止 HTC 菜单,即使你返回 false,那么有些事情是不对的。您是否在物理键盘打开和关闭的情况下尝试过此操作?我可能期望每种情况下的行为都会略有不同。【参考方案2】:这是您看到的标准剪切/复制/粘贴菜单。
有关详细信息,请参阅此主题:
How can I write my own context menu for copy & paste?
问候 哈杰维
【讨论】:
以上是关于EditText 的 onCreateContextMenu() 在真实设备上不起作用的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法让 EditText 开始在 EditText 的左上角输入?
EditText光标默认在第一行,edittext不显示键盘 ,edittext失去焦点
使用 ImageView 动态创建多个 EditText 并将 ImageView 点击值设置为 EditText 并从 EditText 获取值