问题描述
我遇到了有关使用导航组件实现抽屉布局的问题。
我已经使用Android Studio的包含导航抽屉活动创建了抽屉布局。
实际上,如果菜单项的目的是更改导航XML中定义的片段或活动(如屏幕截图中的程序,歌曲,设置等),那么一切都很好
val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
val navView: NavigationView = findViewById(R.id.nav_view)
val navController = findNavController(R.id.nav_host_fragment)
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
appBarConfiguration = AppBarConfiguration(
setof(
R.id.nav_user_programs_list,R.id.nav_user_songs_list,R.id.nav_user_settings,R.id.nav_user_legal_notices,R.id.nav_games
),drawerLayout
)
setupActionBarWithNavController(navController,appBarConfiguration)
navView.setupWithNavController(navController)
但是,我还想在“注销”菜单项上执行注销操作,而不启动另一个片段或活动:
我设法做到了:
navView.setNavigationItemSelectedListener {
if (it.itemId == R.id.nav_logout) {
logoutUser()
}
true
}
但是我的问题是:使用该方法,所有以前可以正常工作(更改片段)的项目都不再起作用,因为它调用了NavigationItemSelectedListener,在这种情况下不起作用。
我希望它足够清楚。如果需要精度,请不要犹豫。
非常感谢您。
解决方法
解决方案
好吧,我知道了,这就是框架所要求的:
NavigationUI.onNavDestinationSelected(dest,navController)
因此,对于其他所有情况,您也可以这样做:
navView.setNavigationItemSelectedListener {dest ->
when(dest.itemId) {
R.id.logout -> logout()
else -> NavigationUI.onNavDestinationSelected(dest,navController)
}
true
}
更新
以上停止“自动关闭”抽屉,所以..
navView.setNavigationItemSelectedListener {dest ->
when(dest.itemId) {
else -> {
NavigationUI.onNavDestinationSelected(dest,navController)
drawerLayout.closeDrawers()
}
}
true
}