我想在我的一些导航抽屉MenuItem上打开一个上下文菜单(为了显示动态创建的项目列表以供选择)。但是我找不到用于registerForContextMenu
的视图,也不知道要手动传递给openContextMenu
的视图(例如,如果我希望上下文菜单也只显示一次)。仅使用MenuItem标识符将不起作用,因为它无法强制转换为View。那么如何在这里使用上下文菜单呢?
答案 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传递为onCreateContextMenu
和groupId
,并设置内部成员变量回到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