我有一个在xml中定义的名为group0
的现有组:
<group android:id="@+id/group0"
android:checkableBehavior="single">
<item
android:id="@+id/nav_camera"
android:icon="@drawable/ic_menu_camera"
android:title="Import" />
<item
android:id="@+id/nav_gallery"
android:icon="@drawable/ic_menu_gallery"
android:title="Gallery" />
</group>
我想为其添加更多选项:
nav_view.menu.add(groupId = R.id.group0, itemId = 85621, order = 12345, title = "adding to group 0")
尽管有targetGroup
参数,但这并没有添加到group0
中。我可以通过删除group0
中的所有内容来确认这一点:
nav_view.menu.removeGroup(R.id.group0)
不会删除新项目。它还不共享XML定义的checkableBehavior
。
如何以编程方式将新项目添加到现有组?
答案 0 :(得分:0)
阅读Android源代码后,我想我对这里的问题有所了解。
新项目确实已如广告所示添加到group0
中。可以通过其groupId
属性进行验证。但是它的行为不像一个。这似乎是我遇到的2个独立问题。
事实证明这是配置错误和Android错误的组合。在removeGroup(int groupId)
方法的源代码中,android开始迭代每个菜单项并检查其groupId
。但是,如果下一个项目不再属于目标组,它将中止该过程。假设同一组中的所有项目都将在导航抽屉中并排显示,这是可接受的优化。这里的“错误配置”是我为order
传递了一个大整数,使我的商品在列表的后面显示。
此处的解决方案是在添加菜单项时为0
参数传递order
,以便它们显示在组中现有项目的旁边。或者,重写removeGroup
函数并删除“优化”代码。
checkableBehavior
。这是因为isCheckable
实际上是每个菜单项的属性,而不是组属性。因此,添加新项目时,它们不会自动正确设置isCheckable
(尽管从技术上讲,Android中的add
方法可以很容易地为我们完成此操作)。
这里的解决方案是在每个新添加的项目上调用isCheckable = true
。