onCreateContextMenu方法没有被调用

7

看起来onCreateContextMenu根本没有被调用。在我的ListActivity的onCreate中,我有:

list = getListView();
registerForContextMenu(list);

我知道这是冗余的,而且我刚刚用相同的结果传递了getListView()。

以下是我的onCreateOptionsMenu:

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    Log.d("LM", "onCreateContextMenu");

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.context_landmarks, menu);
}

日志没有生成。有什么建议吗?

请将此转发给其他人,我还向视图添加了onItemLongClickListener。现在我明白为什么这样做行不通了。 - spuppett
6个回答

8
我的想法是ListView拦截了事件并没有进入上下文菜单的行为。这对我来说很有道理,因为OnItemLongClickListener的行为与上下文菜单重叠。如果不是这样,它怎么能区分上下文菜单和OnItemLongClickListener呢?

这也是我发现的。回到代码后,展示长按是有效的,我恍然大悟。 - spuppett

2
我的问题与lulumeya的答案密切相关,它指引我找到了正确的方向。我之前做过许多次上下文菜单,但直到现在才遇到这个问题。
Adapter.getView(...)中调用View.setOnClickListener(listener)是不正确的,应该使用ListView.setOnItemClickListener(listener)以避免与上下文菜单冲突。
总的来说,我相信OnItemClickListener更加优化,特别是因为只使用一个监听器实例,而不是每次创建或回收视图时创建新实例。

2

只需删除youwidget.setonLongclicklisteneryourwidget.setLongClickable

然后在onCreate()中添加registerforContextmenu(yourwidget),根据使用的小部件添加代码。

希望这对您有所帮助。


0

我曾经遇到过这个问题,只有确保以下几点才能解决:

  1. 因为相应的Activity注册了Views,所以同一个Activity必须重写onCreateContextMenu();在Fragment中这样做是行不通的。
  2. 由于我使用了另一个Fragment来创建Adapter(并向其注册),因此Fragment而不是Activity必须重写onContextItemSelected()。

我正在考虑放弃长按弹出式菜单,转而使用类似Youtube的按钮,位于卡片右边缘,弹出一个不会将其他内容淡化为背景的菜单---顺便问一下,这个搜索词是什么?


0
尝试将registerForContextMenu(list)定位为onCreate方法中的最后一个调用方法。我的意思是,在调用列表适配器之后而不是之前应该调用此方法。

-1

onCreate(Bundle savedInstanceState)方法中调用registerForContextMenu(View view)方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接