带底部导航的导航组件
Navigation component with bottom navigation
我正在使用导航组件和底部导航
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 一起使用。
所以问题是:有一种方法可以处理这种情况,以便在用户已经在该屏幕中时再次加载新片段?
试试这个来忽略用户对同一选定项目的点击:
bottom_navigation.apply {
setOnNavigationItemSelectedListener {
if (it.itemId == bottom_navigation.selectedItemId) {
true
} else when (it.itemId) { ... }
我终于解决了这个问题。
正如我之前所说,这段代码:
bottom_navigation.setupWithNavController(navController)
正在使用
bottom_navigation.setOnNavigationItemSelectedListener { }
所以每次我 select / 重新 select 一个项目时,navController 都会加载一个新的片段。我检查了 setOnNavigationItemSelectedListener()
的 javadoc,它说:
Set a listener that will be notified when a bottom navigation item is selected. This listener * will also be notified when the
currently selected item is reselected, unless an {@link *
OnNavigationItemReselectedListener} has also been set.
所以我所做的是将下一行添加到我的代码中:
bottom_navigation.setOnNavigationItemReselectedListener { }
仅此而已。 navController 将在 selected 项目时加载片段,但在底部导航中重新selected 时不会加载片段。
我更喜欢使用来自 navController
的侦听器:
navController.addOnDestinationChangedListener {
controller, destination, arguments ->
//destination.id for id fragment
}
因此当目的地发生变化时会触发侦听器 - 而不是通过单击 bottom_navigation
。
因为在声明 setupWithNavController
时已经使用了 setOnNavigationItemSelectedListener
。
我正在使用导航组件和底部导航
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 一起使用。
所以问题是:有一种方法可以处理这种情况,以便在用户已经在该屏幕中时再次加载新片段?
试试这个来忽略用户对同一选定项目的点击:
bottom_navigation.apply {
setOnNavigationItemSelectedListener {
if (it.itemId == bottom_navigation.selectedItemId) {
true
} else when (it.itemId) { ... }
我终于解决了这个问题。
正如我之前所说,这段代码:
bottom_navigation.setupWithNavController(navController)
正在使用
bottom_navigation.setOnNavigationItemSelectedListener { }
所以每次我 select / 重新 select 一个项目时,navController 都会加载一个新的片段。我检查了 setOnNavigationItemSelectedListener()
的 javadoc,它说:
Set a listener that will be notified when a bottom navigation item is selected. This listener * will also be notified when the currently selected item is reselected, unless an {@link * OnNavigationItemReselectedListener} has also been set.
所以我所做的是将下一行添加到我的代码中:
bottom_navigation.setOnNavigationItemReselectedListener { }
仅此而已。 navController 将在 selected 项目时加载片段,但在底部导航中重新selected 时不会加载片段。
我更喜欢使用来自 navController
的侦听器:
navController.addOnDestinationChangedListener {
controller, destination, arguments ->
//destination.id for id fragment
}
因此当目的地发生变化时会触发侦听器 - 而不是通过单击 bottom_navigation
。
因为在声明 setupWithNavController
时已经使用了 setOnNavigationItemSelectedListener
。