使用Navigation组件时如何仅保留startDestination清除其余Fragment返回栈
问题根因
你当前的导航配置中,popUpTo指定为导航图本身@+id/nav_graph,且popUpToInclusive设为true,该配置会将导航图内包含起始目的地在内的所有回退栈条目全部弹出,导航完成后回退栈仅剩余本次跳转的目标purchasesFragment,因此按下返回键会直接退出应用。
解决方案
方案1:修改XML导航配置(推荐)
将popUpTo的值替换为你导航图中声明的startDestination对应的id,同时将popUpToInclusive设为false即可。示例如下(请将示例中的homeFragment替换为你实际的起始目的地id):
<fragment android:id="@+id/paymentStatusFragment" android:name="com.gymat.gym.payment_mvp.PaymentStatusFragment" android:label="PaymentStatusFragment" tools:layout="@layout/payment_succesfull"> <action android:id="@+id/action_paymentStatusFragment_to_navigation_purchases" app:destination="@id/purchasesFragment" app:popUpTo="@+id/homeFragment" app:popUpToInclusive="false"/> </fragment>
该配置的作用是:跳转时弹出回退栈中所有在起始目的地之上的Fragment,保留起始目的地本身,跳转完成后回退栈结构为「起始目的地 → purchasesFragment」,按下返回键会回到起始目的地,不会直接退出应用。
方案2:代码动态控制回退栈
如果需要在业务逻辑中灵活控制清栈行为,可以直接调用NavController的API实现:
// 弹出所有回退栈条目直到起始目的地,不弹出起始目的地本身 navController.popBackStack(navController.graph.startDestinationId, false) // 执行跳转逻辑 navController.navigate(R.id.purchasesFragment)
内容的提问来源于stack exchange,提问作者kokoko
相关产品推荐
相关产品推荐

