【问题标题】:How do you implement context menu in a ListActivity on Android?如何在 Android 的 ListActivity 中实现上下文菜单?
【发布时间】:2010-09-30 19:56:29
【问题描述】:

如何实现由长按或点击使用内置布局和 ListAdapter 的 ListActivity 触发的上下文菜单?

【问题讨论】:

  • 您的编辑实际上完全改变了问题。只问不同的问题可能会更好。

标签: android user-interface long-click


【解决方案1】:
listView = (ListView) findViewById(R.id.listpockets);
registerForContextMenu(listView);



public void onCreateContextMenu(android.view.ContextMenu menu, View v, android.view.ContextMenu.ContextMenuInfo menuInfo) {
    //AdapterContextMenuInfo info = (AdapterContextMenuInfo)menuInfo;
    menu.setHeaderTitle(getString(R.string.titleDelete));   
    menu.add(0, CommonUtil.CONTEXT_MENU__DELETE_ID, 0, getString(R.string.menuDelete));
};
@Override
public boolean onContextItemSelected(MenuItem item) {

    if(item.getItemId() == CommonUtil.CONTEXT_MENU__DELETE_ID)
    {
       AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
       long id = this.listView.getItemIdAtPosition(info.position);
       Log.d(TAG, "Item ID at POSITION:"+id);
    }
    else
    {
        return false;
    }
    return true;
}

【讨论】:

    【解决方案2】:

    在 onCreate 方法调用registerForContextMenu 像这样:

    registerForContextMenu(getListView());
    

    然后在onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) 上填充菜单。 menuInfo 参数可以通过这种方式提供有关哪个项目被长按的信息:

    AdapterView.AdapterContextMenuInfo info;
    try {
        info = (AdapterView.AdapterContextMenuInfo) menuInfo;
    } catch (ClassCastException e) {
        Log.e(TAG, "bad menuInfo", e);
        return;
    }
    long id = getListAdapter().getItemId(info.position);
    

    然后您以通常的方式添加菜单项,调用 menu.add:

    menu.add(0, MENU_ITEM_ID, 0, R.string.menu_string);
    

    当用户选择一个选项时,onContextItemSelected 被调用。还有onMenuItemSelected,这个事实在文档中没有明确解释,只是说你使用另一种方法来接收来自上下文菜单的调用;请注意,不要共享 ID。

    在 onContextItemSelected 上,您可以通过调用 getMenuInfo() 获得 MenuInfo 以及所选项目的 ID:

    try {
        info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
    } catch (ClassCastException e) {
        Log.e(TAG, "bad menuInfo", e);
        return false;
    }
    long id = getListAdapter().getItemId(info.position);
    

    【讨论】:

    • 啊,谢谢。一直在网上寻找,但只能找到旧版本。这一款与纸杯蛋糕完美搭配。
    • 我知道 ClassCastException 保护代码出现在 Google 示例中,但我认为这可能是不必要的。 MenuInfo 不太可能只是有时是 AdapterContextMenuInfo - 它可能总是或永远不会。保护子句阻止应用程序崩溃,但无论如何你都有一个逻辑错误。我个人更愿意查看整个堆栈跟踪,但这只是我的偏好。
    • @Daniel Yankowsky:如果你只使用一次registerForContextMenu:是的。但是使用自定义列表活动布局,您可能还需要注册其他元素。但是后来:使用instanceof 并检查你得到了什么不是更好吗? — 啊,好吧,我从未见过任何好的演示代码。
    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 2012-04-11
      • 1970-01-01
      • 2014-06-03
      • 1970-01-01
      • 1970-01-01
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多