如何在导航至非BottomNavigationMenu的Fragment时取消选中菜单项
要实现这个需求,你可以通过监听NavigationController的目的地变化,判断当前页面是否属于底部导航栏包含的Fragment,再动态调整底部导航的选中状态。具体步骤如下:
1. 清理冗余代码
你的原代码中同时使用了setupWithNavController()和自定义的setOnItemSelectedListener,其实setupWithNavController()已经自动完成了菜单项选中与导航目的地的绑定,自定义监听会造成逻辑冲突,建议先移除这部分自定义监听。
2. 添加导航目的地监听
给NavigationController注册OnDestinationChangedListener,在回调中判断当前目的地是否属于底部导航栏的四个Fragment:
- 如果是,底部导航的选中状态会由
setupWithNavController自动维护 - 如果不是,直接取消所有菜单项的选中状态
修改后的完整代码
private fun setUpBottomNavigationMenu() { binding.navigationmenu.apply { val navigationHostFragment = supportFragmentManager.findFragmentById(R.id.containerview) val navigationController = navigationHostFragment?.navController ?: return // 绑定底部导航与导航控制器,自动处理选中状态关联 setupWithNavController(navigationController) // 监听导航目的地变化 navigationController.addOnDestinationChangedListener { _, destination, _ -> // 定义底部导航覆盖的Fragment ID集合 val bottomMenuDestinations = setOf( R.id.first_fragment, R.id.second_fragment, R.id.third_fragment, R.id.fourth_fragment ) // 判断当前页面是否不在底部菜单范围内 if (!bottomMenuDestinations.contains(destination.id)) { // 取消所有菜单项选中状态 // API 28及以上可用clearSelection(),兼容低版本用selectedItemId = 0 clearSelection() // 低版本替代方案:selectedItemId = 0 } } } }
补充说明
clearSelection()方法仅在Android API Level 28及以上可用,若需兼容更低版本,直接设置selectedItemId = 0即可(0不会匹配任何菜单项ID,自然会取消选中)。- 确保Navigation Graph中,非底部菜单的Fragment ID没有和底部菜单的ID重复,否则判断逻辑会失效。
内容的提问来源于stack exchange,提问作者HeraGonz
相关产品推荐
相关产品推荐

