动态添加的子菜单项导航后无法选中问题排查
抽屉菜单动态项选中状态不更新问题
主抽屉菜单中,“Home”为静态菜单项,“Read groups”下的元素从Room数据库动态添加。目前Home菜单可正常显示勾选状态,但导航至动态添加的分组时(所有分组均跳转至同一GroupsShowFragment,仅携带参数不同),对应菜单项的选中状态不更新,Home项甚至仍保持激活状态。
相关代码
drawer_menu.xml
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:showIn="navigation_view"> <group android:checkableBehavior="single"> <item android:id="@+id/menu_nav_home" android:icon="@drawable/ic_action_home" android:title="Home" /> </group> <group android:checkableBehavior="single" android:id="@+id/groups_sub_holder"> <item android:id="@+id/groups_holder" android:title="Read groups"> <menu> </menu> </item> </group> <item android:title="Controls"> <menu> <group android:checkableBehavior="single"> <item android:id="@+id/menu_nav_group_add" android:icon="@drawable/ic_action_add_group" android:title="@string/fragment_title_groups_add" /> <item android:id="@+id/menu_nav_settings" android:icon="@drawable/ic_action_settings" android:title="Settings" /> </group> </menu> </item> </menu>
动态添加Read groups的代码
val navigationView: NavigationView = findViewById<NavigationView>(R.id.nav_view) val menu: Menu = (navigationView.menu.findItem(R.id.groups_holder)).subMenu menu.clear() val allGroups: List<Groups> = GroupsManager.getAllGroups() allGroups.forEach { it.uid?.let { it1 -> menu.add(0, it1, 0, it.name) } }
导航处理代码
private fun handleNavigateTrigger(menuId: Int){ when(menuId) { R.id.menu_nav_home -> { homeFragment = HomeFragment() showFragment(homeFragment) } R.id.menu_nav_settings -> { settingsFragment = SettingsFragment() showFragment(settingsFragment) } R.id.menu_nav_group_add -> { groupsAddFragment = GroupsAddFragment() showFragment(groupsAddFragment) } else -> { groupsShowFragment = GroupsShowFragment.newInstance(menuId) showFragment(groupsShowFragment) val navigationView: NavigationView = findViewById<NavigationView>(R.id.nav_view) Log.e("handleNavigateTrigger", "setCheckedItem($menuId)") navigationView.setCheckedItem(menuId) } } _drawerLayout.closeDrawer(GravityCompat.START) } private fun showFragment(fragment: androidx.fragment.app.Fragment){ supportFragmentManager.beginTransaction() .replace(R.id.frame_layout, fragment) .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) .commit() }
日志显示使用的ID正确,但问题仍未解决。已尝试给分组及父菜单添加android:checkableBehavior="single"属性,均无效。
问题解决办法
1. 给动态菜单项设置可勾选属性
动态添加的菜单项默认不可勾选,即使父分组配置了checkableBehavior,也需要手动开启可勾选状态:
allGroups.forEach { it.uid?.let { it1 -> val menuItem = menu.add(0, it1, 0, it.name) menuItem.isCheckable = true // 关键:启用勾选 } }
2. 处理跨分组的单选互斥
Home所在分组与动态分组是独立的单选分组,选中状态互不影响。要实现全局单选(选中动态项时取消Home的选中),可在导航时手动取消Home的选中状态:
else -> { groupsShowFragment = GroupsShowFragment.newInstance(menuId) showFragment(groupsShowFragment) val navigationView: NavigationView = findViewById<NavigationView>(R.id.nav_view) // 手动取消Home的选中状态 navigationView.menu.findItem(R.id.menu_nav_home).isChecked = false navigationView.setCheckedItem(menuId) }
3. 检查样式与状态干扰
若上述方法无效,可检查NavigationView的itemIconTint和itemTextColor配置,确保选中状态的样式能正常显示;同时排查是否有其他代码逻辑修改了菜单的选中状态。
内容的提问来源于stack exchange,提问作者Mathlight
相关产品推荐
相关产品推荐

