如何使用Navigation Controller设置Navigation Drawer并处理单个菜单项 [英] How to Have Navigation Drawer setup with Navigation Controller and handle individual Menu Items
问题描述
我希望大多数菜单项都由Navigation Component的控制器处理,但我也想像这样单独处理一个注销"菜单项:
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
.
我试图在Google源代码中对此进行验证,但无法轻松找到该存储库.
我通过不调用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
}
I would like to have most of menu item handled by Navigation Component's controller, but I also want to handle one "Log out" menu item individually like this:
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)
Why this doesn't work, and how to resolve this issue?
I'm not sure that there is a proper way to do this at the moment, but you could always just not use the setupWithNavController
method.
I ran into this as well and, as a test, moved my call to setNavigationItemSelectedListener
to after the call to setupWithNavController
and and my navigation code for signing out was running but the rest of the navigation was not. I take this to mean that the navigationListener is overwritten on subsequent calls to setNavigationItemSelectedListener
and that setupWithNavController
calls setNavigationItemSelectedListener
internally.
I attempted to verify this in google source, but couldn't find the repo easily.
I worked around the problem by not calling setupWithNavController
and instead doing something like:
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
}
这篇关于如何使用Navigation Controller设置Navigation Drawer并处理单个菜单项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!