android - 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)
新项目不会被删除。它也不共享checkableBehavior
XML 中定义的内容。
如何以编程方式将新项目添加到现有组?
解决方案
在阅读了Android源代码之后,我想我对这里的问题有了一个想法。
新项目确实group0
像宣传的那样被添加到。可以通过它的groupId
属性来验证。但它的行为不像一个。这似乎是我遇到的两个不同的问题。
- 删除组时不会删除项目。
事实证明这是错误配置和android错误的组合。在removeGroup(int groupId)
方法的源代码中,android 开始迭代每个菜单项并检查其groupId
. 但如果下一个项目不再属于目标组,它将中止该过程。这是一个可接受的优化,假设同一组中的所有项目将在导航抽屉中彼此相邻显示。这里的“错误配置”是我传递了一个大整数 for order
,使我的项目显示在列表的后面。
这里的解决方案是在添加菜单项时传递参数,0
以便order
它们显示在组中现有项目的旁边。或者,覆盖removeGroup
函数并删除“优化”代码。
- 项目不共享
checkableBehavior
由 XML 中的组定义。
这是因为isCheckable
实际上是每个菜单项的属性,而不是组属性。因此,当添加新项目时,它们不会自动isCheckable
正确设置(尽管从技术上讲add
,Android 中的方法可以为我们轻松完成)。
这里的解决方案是调用isCheckable = true
每个新添加的项目。
推荐阅读
- java - 如何使用密码授予在 Spring Boot Oauth2 资源服务器中处理 CORS
- javascript - 读取后节点JS文件为空
- java - 如何将 Spring Boot 应用程序与 HFSQL 数据库连接起来?
- javascript - 使用 office.js 将数据保存到新工作簿
- amazon-web-services - 如何使用 Terraform 将 AWS Elastic IP 分配给新创建的 EC2 实例,而不会在创建另一个实例时重新分配?
- visual-studio-code - ESLint/VSCode 将有效导入标记为未解析
- azure-sql-database - 如何将 Azure 静态 Web 表单数据发送/写入到 Azure SQL 数据库
- c# - System.IO.FileNotFoundException: '系统找不到指定的文件(使用 SetWallpaperAsync)
- javascript - 如何根据 If 条件的结果渲染 React 组件?
- javascript - 有没有办法让 Discord.js 角色在(某些)时间后自行从用户中删除?