Navigation Component中Bottom Navigation点击返回子导航图根页面问题
不要替换setupWithNavController设置的OnItemSelectedListener,这会破坏原有导航逻辑。正确的做法是利用OnItemReselectedListener处理已选中标签的点击事件,既保留原有导航配置,又实现返回子导航图根页面的需求。
实现步骤
- 正常完成BottomNavigationView与NavController的绑定
val navController = findNavController(R.id.nav_host_fragment_container) val bottomNav = findViewById<BottomNavigationView>(R.id.bottom_navigation) bottomNav.setupWithNavController(navController)
- 为BottomNavigationView添加
OnItemReselectedListener处理重选事件
bottomNav.setOnItemReselectedListener { menuItem -> // 构建导航参数:回退到当前标签对应的子导航图根页面 val navOptions = NavOptions.Builder() // setPopUpTo的第一个参数是子导航图的ID,第二个参数设为false表示保留根页面实例 .setPopUpTo(menuItem.itemId, false) .setLaunchSingleTop(true) .build() // 执行导航,自动完成回退到根页面的操作 navController.navigate(menuItem.itemId, null, navOptions) }
原理说明
setupWithNavController已经帮我们处理了不同标签之间的切换逻辑,无需修改它的OnItemSelectedListenerOnItemReselectedListener只会在点击已选中的标签时触发,完美契合当前需求场景- 通过
setPopUpTo(menuItem.itemId, false),导航系统会自动回退到当前标签对应的子导航图根页面,不会重复创建根页面实例
内容的提问来源于stack exchange,提问作者Treasure Receiver
相关产品推荐
相关产品推荐

