我正在使用导航组件和底部导航
val navController = indNavController(R.id.nav_host_fragment)
bottom_navigation.inflateMenu(R.menu.bottom_navigation_menu)
bottom_navigation.setupWithNavController(navController)
我正面临下一个问题:
在底部导航中选择一个项目时,将加载一个片段。当我再次按下相同的项目时,问题就来了,然后将加载一个新的片段,这根本没有意义。
示例: 1-用户选择菜单项A,然后加载FragmentA。 2-用户再次选择菜单项A,然后将加载新的FragmentA,
我正尝试使用
bottom_navigation.setOnNavigationItemSelectedListener { }
但随后的导航将不适用于navController。
所以问题是:有一种方法可以处理这种情况,以便当用户已经在该屏幕中时再次加载新片段?
答案 0 :(得分:2)
最后,我能够解决此问题。
就像我之前说的,这段代码:
bottom_navigation.setupWithNavController(navController)
正在使用
bottom_navigation.setOnNavigationItemSelectedListener { }
因此,每次我选择/重新选择一个项目时,navController都会加载一个新片段。我检查了javadoc中的setOnNavigationItemSelectedListener,它说:
- 设置一个侦听器,当选择底部导航项时将通知该侦听器。该监听器*也会在 除非{@link * 还设置了OnNavigationItemReselectedListener}。
所以我要做的是在代码中添加下一行:
bottom_navigation.setOnNavigationItemReselectedListener { }
仅此而已。在底部导航中选择一个项目时,navController将加载片段,而在底部导航中重新选择该项目时,则不会加载片段。
答案 1 :(得分:0)
尝试执行此操作以忽略用户对同一选定项目的点击:
bottom_navigation.apply {
setOnNavigationItemSelectedListener {
if (it.itemId == bottom_navigation.selectedItemId) {
true
} else when (it.itemId) { ... }
答案 2 :(得分:0)
我更喜欢使用navController
中的监听器:
navController.addOnDestinationChangedListener {
controller, destination, arguments ->
//destination.id for id fragment
}
因此,在目标更改时将触发侦听器,而不是单击bottom_navigation
。
因为声明setOnNavigationItemSelectedListener
时已经使用了setupWithNavController
。