单击上下文菜单

抱歉愚蠢的问题,但我应该更改/添加该代码 – 通过短暂单击列表视图中的项目来显示上下文菜单?

public class MyActivity extends ListActivity implements AdapterView.OnItemClickListener { static final String[] COUNTRIES = new String[]{ "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra", "Angola", "Anguilla", "Antarctica" }; /** * Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setListAdapter(new ArrayAdapter(this, R.layout.list_item, COUNTRIES)); ListView lv = getListView(); lv.setTextFilterEnabled(true); lv.setOnItemClickListener(this); } public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { Log.e("sdklfjsdkljfl", " <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< "); menu.setHeaderTitle("HELLO"); } public void onItemClick(AdapterView adapterView, View view, int i, long l) { Log.e("kjhasjkdhkas", "sdkhjkhskaf"); this.openContextMenu(view); } } 

这里发布的其他解决方案对我不起作用,因为我使用的是ListFragment。 但是,以下解决方案似乎对ListFragment和ListActivity(或者通常只是任何旧的listview)都很有效:

 public void onListItemClick(ListView l, View v, int position, long id){ l.showContextMenuForChild(v); } 

它更加简单和优雅。 实际上,这实际上是ListView类本身如何在长按下启动上下文菜单。

您需要在视图上调用registerForContextMenu。

已编辑以添加对setLongClickable的调用(false)

 public void onItemClick(AdapterView adapterView, View view, int i, long l) { registerForContextMenu( view ); view.setLongClickable(false); // undo setting of this flag in registerForContextMenu this.openContextMenu(view); } 

您还需要实际添加菜单项,否则菜单也不会显示。 仅设置标题是不够的。

注意:我还没有完全跟踪它,但是调用registerForContextMenu(view)会设置一个标志,假设您需要长按上下文菜单。 设置此标志后,AbsListView中的onTouch逻辑将以某种方式不再触发onClick。 我没有时间完全挖掘这个。 虽然当使用像ArrayAdapter这样的简单适配器,并使用带有默认ListView的ListActivity时,您需要决定在短暂单击时显示上下文菜单,还是能够使用longclick。

如果您对长按不感兴趣,可以通过撤消registerForContextMenu(view)中设置的标志来短按上下文菜单;

也许其他人有更多信息或更多时间来挖掘代码。

不要忘记在registerForContextMenu()之后添加它以禁用长按:

 listview.setLongClickable(isRestricted());