禁用在Navigation Architecture Component中将片段添加到backstack

问题描述 投票:4回答:3

假设我有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/谢谢!

android android-architecture-components android-jetpack android-architecture-navigation
3个回答
11
投票

鉴于R.id.fragmentC是C目的地的名称,从X目的地,您可以执行以下操作:

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

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


3
投票

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

<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>

2
投票

正如@bentesha所提到的,这将以这种方式工作,它会弹出片段直到fragmentC包含。

你也可以这样做:

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

要么

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

这将弹出片段A / fragmentB,我认为这是对你自己和其他人理解的最具描述性的方式。

© www.soinside.com 2019 - 2024. All rights reserved.