Fragment回退栈问题:A→B→C返回B后按返回键需回到A的实现方案
解决方案
针对你的回退栈问题,有两种可靠处理方式,可同时满足场景1和场景2的需求:
方式1:修改C返回B时的导航逻辑(推荐)
点击C的保存按钮回到B时,不要用普通的navigate()跳转(这会将新的B实例压入栈,导致栈结构变为A→B→C→B),而是通过带popUpTo参数的导航配置,直接把C从回退栈中移除,确保回到B后栈结构为A→B:
// C页面保存按钮的点击事件逻辑 val navOptions = NavOptions.Builder() .setPopUpTo(R.id.fragmentB, inclusive = false) // 弹出到B页面,不包含B本身,即移除C .build() navController!!.navigate(R.id.fragmentB, null, navOptions)
操作完成后,回到B时回退栈仅保留A和B,此时按下返回键调用popBackStack()会正常回到A。
方式2:修改B的返回键逻辑
如果不想改动C的导航代码,可直接修改B中返回键的处理逻辑,让它直接回退到A,而非只弹出栈顶页面:
// 替换原有的navController!!.popBackStack() navController!!.popBackStack(R.id.fragmentA, false)
- 第一个参数是目标Fragment(A)的id,
- 第二个参数
inclusive设为false,表示仅弹出A之上的所有页面,保留A在栈中(适配场景2从A→B的返回需求)。
内容的提问来源于stack exchange,提问作者Geetika
相关产品推荐
相关产品推荐

