我希望大部分菜单项都由导航组件的 Controller 处理,但我也想单独处理一个“注销”菜单项,如下所示:
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
的调用之后,并且我的用于注销的导航代码正在运行,但导航的其余部分没有运行。我认为这意味着 navigationListener 在随后调用 setNavigationItemSelectedListener
时被覆盖,并且 setupWithNavController
在内部调用 setNavigationItemSelectedListener
。
我试图在谷歌源代码中验证这一点,但无法轻松找到 repo 协议(protocol)。
我通过不调用 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
}
关于android - 如何使用导航 Controller 设置抽屉导航并处理单个菜单项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51743692/