我正在使用导航组件和底部导航。
val navController = indNavController(R.id.nav_host_fragment)
bottom_navigation.inflateMenu(R.menu.bottom_navigation_menu)
bottom_navigation.setupWithNavController(navController)
我面临的下一个问题是:
当在底部导航中选择一个项时,将加载一个片段。当我再次按相同的项目时,问题就会出现,然后将加载一个新的片段,这完全没有意义。
示例: 1-用户选择菜单项A,然后加载FragmentA .用户再次选择菜单项A,然后加载一个新的FragmentA,
我试着用
bottom_navigation.setOnNavigationItemSelectedListener { }
但是,底部导航将不能与navController一起工作。
所以问题是:有一种方法来处理这种情况,以便在用户已经在屏幕上时再次加载一个新的片段?
发布于 2019-06-17 08:19:40
最后,我解决了这个问题。
正如我之前说过的,这个代码:
bottom_navigation.setupWithNavController(navController)
正在使用
bottom_navigation.setOnNavigationItemSelectedListener { }
因此,每次我选择/重新选择一个项目时,navController都会加载一个新的片段。我检查了javadoc的setOnNavigationItemSelectedListener()
,它说:
设置将在选择底部导航项时通知的侦听器。除非还设置了{@link * OnNavigationItemReselectedListener},否则当重新选择当前选定的项时,也会通知此侦听器*。
因此,我所做的就是在代码中添加下一行:
bottom_navigation.setOnNavigationItemReselectedListener { }
仅此而已。当项目被选中时,navController将加载片段,而不是在底部导航中重新选择项时加载片段。
发布于 2020-08-24 04:50:29
我更喜欢使用来自navController
的侦听器
navController.addOnDestinationChangedListener {
controller, destination, arguments ->
//destination.id for id fragment
}
因此,当目标发生变化时,侦听器就会被触发--而不是通过单击bottom_navigation
。
因为在声明setOnNavigationItemSelectedListener
时已经使用了setupWithNavController
。
发布于 2019-06-16 12:02:07
尝试这样做,以忽略用户对同一选定项的单击:
bottom_navigation.apply {
setOnNavigationItemSelectedListener {
if (it.itemId == bottom_navigation.selectedItemId) {
true
} else when (it.itemId) { ... }
https://stackoverflow.com/questions/56618583
复制相似问题