You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动态添加的子菜单项导航后无法选中问题排查

抽屉菜单动态项选中状态不更新问题

主抽屉菜单中,“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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 13:00:50