底部导航的导航组件

时间:2019-06-16 11:53:59

标签: android android-fragments bottomnavigationview

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

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。

所以问题是:有一种方法可以处理这种情况,以便当用户已经在该屏幕中时再次加载新片段?

3 个答案:

答案 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