android - 导航抽屉项目点击
问题描述
我有DrawerLayout和NavigationView。当我单击导航抽屉中的项目时,有两个片段发生了变化,效果很好:
<fragment
android:id="@+id/nav_settings"
android:label="@string/menu_settings"
tools:layout="@layout/fragment_settings" />
<fragment
android:id="@+id/nav_themes"
android:label="@string/menu_themes"
tools:layout="@layout/fragment_themes" />
问题是我在抽屉菜单中还有其他几个不是片段的项目,我无法使它们可点击:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:showIn="navigation_view">
<group
android:id="@+id/group_1"
android:checkableBehavior="single">
<item
android:id="@+id/nav_settings"
android:icon="@drawable/ic_keyboard_settings"
android:title="@string/menu_settings" />
<item
android:id="@+id/nav_themes"
android:icon="@drawable/ic_theme"
android:title="@string/menu_themes" />
</group>
<group android:id="@+id/group_2">
<item
android:id="@+id/nav_developer_page"
android:icon="@drawable/ic_developer_page"
android:title="@string/menu_developer_page" />
<item
android:id="@+id/nav_privacy_policy"
android:icon="@drawable/ic_privacy_policy"
android:title="@string/menu_privacy_policy" />
</group>
</menu>
这是代码:
setSupportActionBar(toolbar)
toggle = object : ActionBarDrawerToggle(this, drawer_layout, toolbar, 0, 0) {
override fun onDrawerClosed(drawerView: View) {
super.onDrawerClosed(drawerView)
syncState()
}
override fun onDrawerOpened(drawerView: View) {
super.onDrawerOpened(drawerView)
syncState()
}
}
toggle.syncState()
drawer_layout.addDrawerListener(toggle)
val navController = findNavController(R.id.nav_host_fragment)
appBarConfiguration = AppBarConfiguration(setOf(
R.id.nav_settings, R.id.nav_themes, R.id.nav_developer_page), drawer_layout)
nav_view.setupWithNavController(navController)
toggle.syncState()
当我设置NavigationItemSelectedListener时,它会破坏片段的导航。
如何使这两个项目可点击并调用函数?
解决方案
解决方案是从导航视图中获取菜单项并设置点击监听器:
val signoutMenuItem = binding.nvNavigationDrawerNavigationView.menu.findItem(id.navigation_drawer_menu_sign_out)
signoutMenuItem.setOnMenuItemClickListener {
navigationDrawerMainActivityViewModel.signOut()
true
}
并且不包括非片段项目AppBarConfiguration
:
appBarConfiguration = AppBarConfiguration(
setOf(
id.drawerFragmentX,
id.drawerFragmentY,
//id.navigation_drawer_menu_sign_out <- Do NOT include
), drawerLayout
)
setupActionBarWithNavController(navController, appBarConfiguration)
navView.setupWithNavController(navController)
此解决方案与https://stackoverflow.com/a/59451345/5189200相同。
哈维
推荐阅读
- ansible - 如何在单个或简短的主机列表上运行剧本并从主机不属于的清单组中获取内容?
- kubernetes - etcd.service 失败,因为超过了超时
- mysql - mysql8.0.22设置默认值DATE_FORMAT(sysdate(),'%Y%m%d')报错
- python - Python:使用在 If 语句中返回两个项目的函数,而不执行两次
- python - Go 中的 slice 可以像 Python 的 list 一样成倍增加吗?
- python - Python 3.7 - UnicodeEncordeError:“charmap”编解码器无法在位置 25 编码字符“\ufffd”:字符映射到
- javascript - 如何去除文本中换行造成的多余空格,使背景颜色不多余?
- ios - 更新 SubView @ObservedObject SwiftUI 后如何更新 ParentView
- r - 如何在另一个循环中循环两个循环
- python - python:计算数据框的列并将它们添加到新列