Android Navigation组件跳转Fragment时如何将当前Fragment弹出返回栈
问题原因说明
- 第一种方案配置后不生效,基本都是跳转时没有调用你配置好的action id,而是直接通过Frag B的id跳转,导致action里的
popUpTo、popUpToInclusive配置没有被触发,Frag A自然保留在返回栈中。 - 第二种方案跳转前先调用
popBackStack()会崩溃,是因为当前返回栈只有Frag A一个页面,弹出后返回栈为空,NavController丢失导航上下文,后续跳转操作无法正常执行。
正确实现方案
方案1:XML导航图配置Action(推荐)
在导航图中给Frag A定义跳转到Frag B的专属action,配置如下:
<fragment android:id="@+id/fragA" android:name="xxx.FragA" android:label="Frag A"> <action android:id="@+id/action_fragA_to_fragB" app:destination="@id/fragB" app:popUpTo="@id/fragA" app:popUpToInclusive="true" /> </fragment>
跳转时必须调用该action的id触发跳转,不能直接跳Frag B的id:
// Frag A 中执行跳转 findNavController().navigate(R.id.action_fragA_to_fragB)
方案2:代码动态配置NavOptions实现
如果不想在XML中配置action,可以在跳转时动态指定弹栈规则:
val navOptions = NavOptions.Builder() .setPopUpTo(R.id.fragA, inclusive = true) .build() findNavController().navigate(R.id.fragB, null, navOptions)
效果验证
跳转完成后可通过以下代码打印返回栈确认结果:
val backStackLabels = findNavController().backQueue .map { it.destination.label } Log.d("NavStack", backStackLabels.toString()) // 输出结果应为 [Frag B]
内容的提问来源于stack exchange,提问作者Augusto Carmo
相关产品推荐
相关产品推荐

