android 导航后未选择以编程方式添加的子菜单项

mbzjlibv  于 2023-01-11  发布在  Android
关注(0)|答案(1)|浏览(129)

我有下面的主菜单抽屉,其中的“Home按钮”是静态的,但是“Read groups”下面的元素是动态添加的,正如你所看到的,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>

用于动态添加读取组的代码(数据来自Room数据库):

// Add menu source: https://stackoverflow.com/a/31722855/1175881
val navigationView: NavigationView = findViewById <NavigationView> (R.id.nav_view)
val menu: Menu = (navigationView.menu.findItem(R.id.groups_holder)).subMenu
menu.clear()

// adding a section and items into it
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"组,甚至作为整个菜单父级,但没有用。我感觉我错过了一个小但非常重要的步骤,但找不到那是什么。

tjrkku2a

tjrkku2a1#

  • 这是一个自我答案,但希望在未来与任何人分享找到的解决方案(只能在2天内接受此答案,所以我会回来做这件事)*

我终于发现了this SO answer by Danial B
只使用setChecked会导致部分(但不充分且不能正确工作)选中的菜单项。我必须确保该菜单项可以使用setCheckable进行检查。这会导致以下代码:

val navigationView: NavigationView = findViewById <NavigationView> (R.id.nav_view)
val groupItem: MenuItem = navigationView.menu.findItem(menuId)
groupItem.isCheckable = true
groupItem.isChecked = true

相关问题