繁体   English   中英

带底部导航的导航组件

[英]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.setupWithNavController(navController)

正在使用

bottom_navigation.setOnNavigationItemSelectedListener {  }

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

设置一个在选择底部导航项时将收到通知的侦听器。 除非 {@link * OnNavigationItemReselectedListener} 也已设置,否则在重新选择当前选定的项目时也会通知此侦听器 *。

所以我所做的是将下一行添加到我的代码中:

bottom_navigation.setOnNavigationItemReselectedListener { }

就这样。 当一个项目被选中时,navController 将加载一个片段,而不是在底部导航中重新选择一个项目时。

试试这个来忽略用户对同一个选定项目的点击:

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

我更喜欢使用来自navController的监听navController

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

因此,当目标更改时会触发侦听器 - 而不是通过单击bottom_navigation
由于setOnNavigationItemSelectedListener已经被使用时setupWithNavController声明。

当您在bottom_navigation.setupWithNavController(navController)之前使用bottom_navigation.setOnNavigationItemSelectedListener { }时,OnNavigationItemSelectedListener 在setupWithNavController function 中被覆盖。所以使用

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM