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

igo*_*_rb 8 android android-architecture-components android-jetpack android-architecture-navigation

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

... -> A -> C -> X    and ... -> B -> C -> X
Run Code Online (Sandbox Code Playgroud)

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

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

ben*_*sha 13

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

NavController controller = Navigation.findNavController(view);
controller.popBackStack(R.id.fragmentC, true);
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您以编程方式导航,那么如果您使用 BottomNavigation 视图导航到其他片段,那没关系 (2认同)

Muh*_*ood 5

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

您还可以按如下方式实现此目的:

NavController controller = Navigation.findNavController(view);
controller.popBackStack(R.id.fragmentA, false);
Run Code Online (Sandbox Code Playgroud)

或者

NavController controller = Navigation.findNavController(view);
controller.popBackStack(R.id.fragmentB, false);
Run Code Online (Sandbox Code Playgroud)

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


Via*_*lav 5

另外,您可以使用导航资源中的app:popUpToapp:popUpToInclusive属性在xml执行某些事务时自动清除向后堆栈,因此,“后退” /“向上”按钮会将您的用户带到根目录片段。

<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>
Run Code Online (Sandbox Code Playgroud)