使用Navigation Component时,如何从返回栈加载已存在的Fragment?
当目标Fragment已经在返回栈中时,你可以调用navController.popBackStack(R.id.myFragment, false)来回到该Fragment。这个方法会弹出返回栈中位于目标Fragment之上的所有条目,同时保留目标Fragment本身,这样就能直接加载并显示它。
优化后的代码示例(替代try-catch,更优雅)
不用依赖异常判断,直接利用findBackStackEntry返回null的特性:
val targetFragmentEntry = navController.findBackStackEntry(R.id.myFragment) if (targetFragmentEntry != null) { // 目标Fragment在返回栈中,弹出上面的栈元素回到它 navController.popBackStack(R.id.myFragment, false) } else { // 目标Fragment不存在,导航过去 navController.navigate(R.id.action_to_myFragment) }
保留原try-catch写法的版本
在原代码的try块中补充逻辑即可:
try { navController.getBackStackEntry(R.id.myFragment) // 从返回栈加载目标Fragment navController.popBackStack(R.id.myFragment, false) } catch (Exception e) { navController.navigate(R.id.action_to_myFragment) }
关键参数说明
popBackStack的第二个参数inclusive:
- 传
false:仅弹出目标Fragment之上的所有栈条目,目标Fragment会成为栈顶并显示 - 传
true:会连目标Fragment一起弹出,不符合需求,因此这里必须传false
内容的提问来源于stack exchange,提问作者Ghazal
相关产品推荐
相关产品推荐

