我希望导航组件的控制器处理大部分菜单项,但我也想单独处理一个“注销”菜单项,如下所示:
val navController = findNavController(R.id.nav_host_fragment)
nav_view.setNavigationItemSelectedListener { item ->
when(item.itemId) {
R.id.logout_menu_item -> {
Toast.makeText(context, "Logut Menu Item Touched", Toast.LENGTH_LONG).show()
true
}
else -> false
}
}
nav_view.setupWithNavController(navController)
bottom_navigation.setupWithNavController(navController)
为什么这不起作用,以及如何解决这个问题?
我不确定目前是否有正确的方法可以做到这一点,但你总是可以不使用setupWithNavController
方法。
我也遇到了这个问题,作为一个测试,在调用setNavigationItemSelectedListener
之后将我的调用移到了setupWithNavController
并且我的导航代码正在运行,但导航的其余部分却没有。我认为这意味着后续调用setNavigationItemSelectedListener
时会覆盖navigationListener,而setupWithNavController
会在内部调用setNavigationItemSelectedListener
。
我试图在谷歌来源验证这一点,但无法轻易找到回购。
我通过不调用setupWithNavController
来解决这个问题,而是做了类似的事情:
navigationDrawer?.setNavigationItemSelectedListener { menuItem ->
if (menuItem.itemId == R.id.action_sign_out) {
// sign out logic
return@setNavigationItemSelectedListener true
}
val result = menuItem.onNavDestinationSelected(navigationController)
drawerLayout?.closeDrawers()
result
}