底部导航的导航组件

3
我正在使用导航组件和底部导航。
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一起使用。

因此问题是:是否有一种方法来处理这种情况,以便当用户已经处于该屏幕时再次加载新的片段?

4个回答

10

最终,我成功解决了这个问题。

就像我之前说过的那样,这段代码:

bottom_navigation.setupWithNavController(navController)

正在使用

bottom_navigation.setOnNavigationItemSelectedListener {  }

所以每次我选择/重新选择一个项目时,navController都会加载一个新的fragment。 我查看了setOnNavigationItemSelectedListener() 的 javadoc,它说:

设置一个监听器,当底部导航项被选中时将通知此监听器,除非已经设置了{@link OnNavigationItemReselectedListener},否则此监听器还将在重新选择当前选定的项时收到通知。

所以我在我的代码中添加了下一行:

bottom_navigation.setOnNavigationItemReselectedListener { }

就这些。当在底部导航中选择一个项目时,navController会加载一个fragment,但是当重新选择一个项目时,它不会再次加载该项目。


谢谢,@Ocampo,这节省了我很多时间。 - Kotdroid
快速简便。谢谢! - Manuel Rodriguez

1

我更喜欢使用navController中的监听器:

navController.addOnDestinationChangedListener { 
    controller, destination, arguments -> 
        //destination.id for id fragment        
}

因此,当目标发生变化时,监听器被触发 - 不是通过点击 bottom_navigation
这是因为在声明 setupWithNavController 时已经使用了 setOnNavigationItemSelectedListener

0

当您在bottom_navigation.setupWithNavController(navController)之前使用bottom_navigation.setOnNavigationItemSelectedListener { }时,OnNavigationItemSelectedListener将在setupWithNavController函数内被覆盖。因此,请使用

navController.addOnDestinationChangedListener { 
controller, destination, arguments -> 
    //destination.id for id fragment        
}

0

尝试使用以下方法来忽略用户在相同选择项目上的点击:

bottom_navigation.apply {
        setOnNavigationItemSelectedListener {
            if (it.itemId == bottom_navigation.selectedItemId) {
                true
            } else when (it.itemId) { ... }

嗨!我没有使用列表。当我说“item”时,我指的是底部导航的项目。 - Leandro Ocampo
那种方法的问题在于,这行代码 bottom_navigation.setupWithNavController(navController) 就无法工作了。因此,唯一的解决方案似乎是删除导航组件和底部导航之间的连接。 - Leandro Ocampo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接