Android开发:如何在运行时向子菜单的Group中添加菜单项?
嘿,这个问题我之前踩过坑!你之所以会出现菜单项和Group平级的情况,是因为误解了subMenu.add()第一个参数的作用——它不是用来指定要加入的目标Group ID,而是菜单项的分类ID,这俩完全不是一回事儿。
要把菜单项真正放到<group android:id="@+id/group_modules">内部,你需要先获取到这个Group对象,再通过它来添加子项,具体步骤如下:
Inflate菜单后,找到对应的子菜单和目标Group
首先在onCreateOptionsMenu(或者你处理菜单的地方),先Inflate你的菜单文件,然后找到action_module_selector对应的MenuItem,再拿到它的子菜单,最后在子菜单里定位到group_modules这个MenuGroup。通过MenuGroup对象添加菜单项
拿到MenuGroup后,调用它的add()方法来添加菜单项,这样新的项就会被放入Group内部,同时继承Group的checkableBehavior="single"属性。
给你一个完整的代码示例:
@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate你的主菜单文件 getMenuInflater().inflate(R.menu.main_menu, menu); // 找到"模块选择器"的菜单项 MenuItem moduleSelectorItem = menu.findItem(R.id.action_module_selector); // 获取它的子菜单 SubMenu moduleSubMenu = moduleSelectorItem.getSubMenu(); // 找到目标Group(注意要转成MenuGroup类型) MenuGroup modulesGroup = (MenuGroup) moduleSubMenu.findItem(R.id.group_modules); // 循环添加你的模块菜单项(示例) for (Module module : yourModuleList) { // 通过Group的add方法添加,参数依次是:group ID、item ID、排序顺序、标题 modulesGroup.add(R.id.group_modules, module.getId(), Menu.NONE, module.getTitle()) // 因为Group已经设置了single checkable,这里可以不用手动设置,不过显式写也没问题 .setCheckable(true); } return true; }
额外说明:
- 为什么原来的方法不行?
subMenu.add(int groupId, int itemId, int order, CharSequence title)里的第一个groupId是用来对菜单项进行分类的标记,不是指定父容器的ID,所以即使你传入R.id.group_modules,系统也只会把这个ID当成分类标签,不会把项放到对应的Group里。 - 如果你的Group已经设置了
android:checkableBehavior="single",通过modulesGroup.add()添加的菜单项会自动继承这个可单选的行为,不需要额外调用setCheckable(true),当然显式设置也不会有问题。
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

