如何在导航抽屉的MenuItem上创建上下文菜单?

时间:2016-05-01 15:50:45

标签: android contextmenu navigation-drawer

我想在我的一些导航抽屉MenuItem上打开一个上下文菜单(为了显示动态创建的项目列表以供选择)。但是我找不到用于registerForContextMenu的视图,也不知道要手动传递给openContextMenu的视图(例如,如果我希望上下文菜单也只显示一次)。仅使用MenuItem标识符将不起作用,因为它无法强制转换为View。那么如何在这里使用上下文菜单呢?

1 个答案:

答案 0 :(得分:0)

我最终成功实现这一目标的一种方法是在上下文菜单中注册整个NavigationView,并在手动调用{之前“每次单击/长按项目时将其存储在内部成员变量中,以跟踪选择的menuItem NavigationView上的{1}}。然后可以仅为我实际需要上下文菜单的那些MenuItem实现openContextMenu

更具体地说,我将抽屉注册为上下文菜单,如下所示:

onCreateContextMenu

我介绍了一个成员变量

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.top_menu, menu);
    NavigationView nav_draw = (NavigationView) findViewById(R.id.nav_view);
    if (nav_draw != null) {
        registerForContextMenu(nav_draw);
    }
    return true;
}
只要没有选择“有趣”菜单项,我就保持为null,否则我将调用菜单项存储在其中并手动打开上下文菜单:

private MenuItem _lastNavDrawerMenuItemSelected = null;

public void inflateSubMenu(MenuItem item) { NavigationView v = (NavigationView) findViewById(R.id.nav_view); if (v != null) { _lastNavDrawerMenuItemSelected = item; openContextMenu(v); } } 中,我确保只处理所需的MenuItems,将NavigationView的ID和当前MenuItem传递为onCreateContextMenugroupId,并设置内部成员变量回到itemId

null

最后,我基于@Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); if (v.getId() == R.id.nav_view) { if (_lastNavDrawerMenuItemSelected != null) { if (_lastNavDrawerMenuItemSelected.getItemId() == R.id.my_submenu_item_id) { menu.setHeaderTitle(...); menu.add(v.getId(),_lastNavDrawerMenuItemSelected.getItemId(), Menu.NONE, <ENTRY TITLE>); ... } _lastNavDrawerMenuItemSelected = null; } } } (我设置为上面的NavigationView)和groupId(我设置为构建了上下文菜单的MenuItem)实现了必要的操作:

itemId