首页 > 解决方案 > Navigation Drawer - 如何在运行时将项目添加到现有菜单组

问题描述

我有这个现有的组,称为group0,在 xml 中定义:

<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)

新项目不会被删除。它也不共享checkableBehaviorXML 中定义的内容。

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

标签: androidnavigation-drawer

解决方案


在阅读了Android源代码之后,我想我对这里的问题有了一个想法。

新项目确实group0像宣传的那样被添加到。可以通过它的groupId属性来验证。但它的行为不像一个。这似乎是我遇到的两个不同的问题。

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

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

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

  1. 项目不共享checkableBehavior由 XML 中的组定义。

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

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


推荐阅读