带导航组件的抽屉布局 - 只有一个项目的监听器
Drawer layout with navigation component - Listener on only one item
我遇到了有关使用导航组件实施抽屉式布局的问题。
我使用 Android Studio 的 include Navigation Drawer Activity 创建了抽屉布局。
实际上,如果菜单项的目的是更改片段或activity(如程序、歌曲、设置等...在屏幕截图中)在导航中定义,一切都很好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)
但是,我还想在“注销”菜单项上执行注销操作,而不启动另一个片段或 activity :
我设法做到了:
navView.setNavigationItemSelectedListener {
if (it.itemId == R.id.nav_logout) {
logoutUser()
}
true
}
但我的问题是:使用该方法,所有其他曾经工作的项目(更改片段)不再工作,因为它调用了 NavigationItemSelectedListener,在这种情况下什么都不做。
是否有结合这两种方法的解决方案? :
- 使用 android studio
的默认抽屉布局更改片段
- 使用 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
}
我遇到了有关使用导航组件实施抽屉式布局的问题。
我使用 Android Studio 的 include Navigation Drawer Activity 创建了抽屉布局。
实际上,如果菜单项的目的是更改片段或activity(如程序、歌曲、设置等...在屏幕截图中)在导航中定义,一切都很好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)
但是,我还想在“注销”菜单项上执行注销操作,而不启动另一个片段或 activity :
我设法做到了:
navView.setNavigationItemSelectedListener {
if (it.itemId == R.id.nav_logout) {
logoutUser()
}
true
}
但我的问题是:使用该方法,所有其他曾经工作的项目(更改片段)不再工作,因为它调用了 NavigationItemSelectedListener,在这种情况下什么都不做。
是否有结合这两种方法的解决方案? :
- 使用 android studio 的默认抽屉布局更改片段
- 使用 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
}