android-fragments 具有底部导航的导航组件

hts6caw3  于 2022-11-14  发布在  Android
关注(0)|答案(4)|浏览(242)

我正在使用导航组件和底部导航

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一起工作。
所以问题是:有没有办法处理这种情况,以便在用户已经在那个屏幕中时再次加载新的片段?

g6ll5ycj

g6ll5ycj1#

最后,我能够修复这个问题。
正如我之前所说,这段代码:

bottom_navigation.setupWithNavController(navController)

正在使用

bottom_navigation.setOnNavigationItemSelectedListener {  }

所以每次我选择/重新选择一个项目时,navController会加载一个新的片段。我检查了setOnNavigationItemSelectedListener()的javadoc,它说:
设置在选择底部导航项时将收到通知的侦听器。除非还设置了{@link * OnNavigationItemReselectedListener},否则在重新选择当前选定项时也将通知此侦听器 *。
因此,我所做的就是在代码中添加下一行:

bottom_navigation.setOnNavigationItemReselectedListener { }

navController会在选择一个项时加载一个片段,但在底部导航中重新选择一个项时不会加载。

wvt8vs2t

wvt8vs2t2#

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

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

因此,当目的地更改时,侦听器会被触发,而不是通过单击bottom_navigation
因为在声明setupWithNavController时已经使用了setOnNavigationItemSelectedListener

mctunoxg

mctunoxg3#

尝试执行以下操作以忽略用户对同一选定项目的单击:

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

4smxwvx54#

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

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

相关问题