禁用将片段添加到导航体系结构组件中的后堆栈

时间:2018-09-27 09:27:24

标签: android android-architecture-components android-jetpack android-architecture-navigation

假设我有4个片段:A,B,C,X,并且我可以通过这种方式在它们之间导航:

... -> A -> C -> X    and ... -> B -> C -> X

但是当我在片段X中时,打电话给mNavController.navigateUp(),我想跳过片段C并转到片段A或B。我需要做什么?

UPD:我只需要导航架构组件https://developer.android.com/topic/libraries/architecture/navigation/的解决方案 谢谢!

3 个答案:

答案 0 :(得分:10)

给出R.id.fragmentC是C目标的名称,从X目标开始,您可以执行以下操作:

NavController controller = Navigation.findNavController(view);
controller.popBackStack(R.id.fragmentC, true);

这应该将所有目的地从堆栈中弹出,直到C之前,并在堆栈顶部保留A或B。

答案 1 :(得分:2)

如@bentesha所提到的那样,它的工作方式是将片段弹出直到包含fragmentC。

您还可以通过以下方式实现此目标:

NavController controller = Navigation.findNavController(view);
controller.popBackStack(R.id.fragmentA, false);

OR

NavController controller = Navigation.findNavController(view);
controller.popBackStack(R.id.fragmentB, false);

这将专门弹出fragmentA / fragmentB,我认为这是您自己和他人理解的最描述方式。

答案 2 :(得分:2)

或者,您可以使用导航app:popUpTo资源中的app:popUpToInclusivexml属性在执行某些事务时自动清理回栈,因此back / up按钮会将您的用户带到根目录片段

<fragment
    android:id="@+id/fragment1"
    android:name="com.package.Fragment1"
    android:label="Fragment 1">

    <action
        android:id="@+id/action_fragment1_to_fragment2"
        app:destination="@id/fragment2"
        app:popUpTo="@id/fragment1"
        app:popUpToInclusive="true / false" />

</fragment>