导航抽屉-如何在运行时将项目添加到现有菜单组

时间:2018-10-31 00:39:12

标签: android navigation-drawer

我有一个在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

如何以编程方式将新项目添加到现有组?

1 个答案:

答案 0 :(得分:0)

阅读Android源代码后,我想我对这里的问题有所了解。

新项目确实已如广告所示添加到group0中。可以通过其groupId属性进行验证。但是它的行为不像一个。这似乎是我遇到的2个独立问题。

  1. 删除群组时,不会删除项目。

事实证明这是配置错误和Android错误的组合。在removeGroup(int groupId)方法的源代码中,android开始迭代每个菜单项并检查其groupId。但是,如果下一个项目不再属于目标组,它将中止该过程。假设同一组中的所有项目都将在导航抽屉中并排显示,这是可接受的优化。这里的“错误配置”是我为order传递了一个大整数,使我的商品在列表的后面显示。

此处的解决方案是在添加菜单项时为0参数传递order,以便它们显示在组中现有项目的旁边。或者,重写removeGroup函数并删除“优化”代码。

  1. 项目不共享XML群组定义的checkableBehavior

这是因为isCheckable实际上是每个菜单项的属性,而不是组属性。因此,添加新项目时,它们不会自动正确设置isCheckable(尽管从技术上讲,Android中的add方法可以很容易地为我们完成此操作)。

这里的解决方案是在每个新添加的项目上调用isCheckable = true