我有下面的主菜单抽屉,其中的“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"
组,甚至作为整个菜单父级,但没有用。我感觉我错过了一个小但非常重要的步骤,但找不到那是什么。
1条答案
按热度按时间tjrkku2a1#
我终于发现了this SO answer by Danial B。
只使用
setChecked
会导致部分(但不充分且不能正确工作)选中的菜单项。我必须确保该菜单项可以使用setCheckable
进行检查。这会导致以下代码: