Android Navigation 导航时弹出当前Fragment且不加入回退栈如何实现?
最优实现方案
你在Fragment B中导航到C时,动态获取当前B的目的地ID作为popUpTo参数即可,不需要感知前序页面、也不需要后续页面做特殊适配,完全符合官方API设计规范,不属于hack实现:
findNavController().apply { currentDestination?.id?.let { currentBId -> navigate( resId = R.id.C, navOptions = NavOptions.Builder() .setPopUpTo(currentBId, inclusive = true) .build() ) } }
原方案失效原因
你之前写死setPopUpTo(R.id.B, inclusive = true)不生效,大概率是因为B的实际回退栈条目ID和你引用的R.id.B不匹配:比如B在嵌套导航图中、通过全局动作/深链跳转进入时,可能出现ID引用偏差。动态读取当前目的地ID可以完全规避这个问题。
逻辑验证
导航动作的执行顺序是「先执行popUpTo逻辑弹出栈条目,再压入新的目的地」,对应你的场景:
- 跳转前回退栈为
[...前序页面, B] - 执行popUpTo(B, true):弹出包括B在内的所有栈顶条目,栈变为
[...前序页面] - 压入C,最终栈为
[...前序页面, C] - 用户在C页点击返回键,直接回到B的前序页面,完全符合需求
拓展适配
如果你使用Safe Args生成导航动作,只需要在调用动作的navigate方法时,覆盖传入上述动态生成的NavOptions即可,不需要修改导航图配置。
内容的提问来源于stack exchange,提问作者CampbellMG
相关产品推荐
相关产品推荐

