如何防止BottomNavigation点击EarningFragment时恢复嵌套的MoneyDetailFragment
解决方案
要实现点击底部导航的Earnings项时直接打开EarningFragment而非恢复之前的MoneyDetailFragment状态,核心是强制重置该导航项的栈到根目的地,具体修改如下:
修改MainActivity中的底部导航逻辑
替换原有的setupWithNavController默认逻辑,手动处理底部导航项的点击事件,针对Earnings项添加栈重置操作:
private fun setupBottomNavigationView() { BottomNavigationViewHelper.setupBottomNavigationView(binding.bottomBar.bottomNavViewBar) // 手动处理底部导航点击事件,替换默认的setupWithNavController binding.bottomBar.bottomNavViewBar.setOnItemSelectedListener { item -> when (item.itemId) { R.id.miEarnings -> { // 导航到EarningFragment,同时清空该栈内的所有子页面 navHostFragment.navController.navigate(R.id.miEarnings) { // 弹出到miEarnings并包含自身,确保栈内只有根页面 popUpTo(R.id.miEarnings) { inclusive = true } // 避免重复点击时重复创建页面 launchSingleTop = true } true } else -> { // 其他导航项保留默认状态恢复逻辑 NavigationUI.onNavDestinationSelected(item, navHostFragment.navController) } } } }
代码说明
popUpTo(R.id.miEarnings) { inclusive = true }:将导航栈中从当前页面到miEarnings的所有页面弹出,同时重新创建miEarnings实例,确保每次点击都是全新的根页面。launchSingleTop = true:防止重复点击同一导航项时重复创建页面,提升性能。- 其他导航项沿用默认逻辑,保留原有状态恢复功能。
注意事项
确保底部导航菜单中Earnings项的android:id与导航图里的miEarnings id完全一致,否则点击事件无法匹配。
内容的提问来源于stack exchange,提问作者Ahmet Yılmaz
相关产品推荐
相关产品推荐

