如何在不返回片段 C 的情况下从片段 D 直接返回片段 A?

How can I go back directly to Fragment A since Fragment D without going back to Fragment C?

我使用 Android 导航架构组件。

我有三个片段 A、B 和 C

在片段 D 上,我有一个用于验证修改和完成的按钮。 从这个 Frgament D 我想:

  1. return到Fragment B当我来自Fragment B时(我用findNavController().navigateUp()
  2. 从片段C回来再回到片段A(我不知道怎么做)

从Fragment D过来不返回Fragment C,如何直接返回Fragment A?

我是否应该等待片段 C 上的 return 并重新处理以执行 findNavController().NavigateUp()

我在 NavOptions 上使用 setPopUpTo,或者您也可以在 xml 中使用它

文档 => https://developer.android.com/reference/androidx/navigation/NavOptions.Builder#setPopUpTo(int,%20boolean)

您可以通过 findNavController().NavigateUp()

实现这两个操作

例如下图:

   <?xml version="1.0" encoding="utf-8"?>
   <navigation xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/test_nav_graph"
        app:startDestination="@id/a">

        <fragment
            android:id="@+id/a"
            android:name="fragment.A"
            tools:layout="@layout/a_fragment"
            android:label="A" >
            <action
                android:id="@+id/action_a_to_b"
                app:destination="@id/b" />
            <action
                android:id="@+id/action_a_to_c"
                app:destination="@id/c" />
        </fragment>
        <fragment
            android:id="@+id/b"
            android:name="fragment.B"
            tools:layout="@layout/b_fragment"
            android:label="B" >
            <action
                android:id="@+id/action_b_to_d"
                app:destination="@id/d" />
        </fragment>
        <fragment
            android:id="@+id/c"
            tools:layout="@layout/c_fragment"
            android:name="fragment.C"
            android:label="C" >
            <action
                android:id="@+id/action_c_to_d"
                app:destination="@id/d"
                app:popUpTo="@id/a"/>
        </fragment>
        <fragment
            android:id="@+id/d"
            tools:layout="@layout/d_fragment"
            android:name="fragment.D"
            android:label="D" />
    </navigation>

当您选择路径:A->B->D 时,您的返回堆栈是 A、B、D,当您调用 NavigateUp() 时,您返回到 B

现在路径 A->C->D 在 action 标记中有一个小的添加,如您所见

    <action
    android:id="@+id/action_c_to_d"
    app:destination="@id/d"
    app:popUpTo="@id/a"/>

它有 popUpTo,所以当您从 C 导航到 D 时,app:popUpTo 告诉导航库从返回堆栈中弹出一些目的地作为对 navigate() 的调用,因此在导航到 D 后,您的返回堆栈是 A、D,并且 NavigateUp() 将您带回到 A

因此,当您在 Fragment D 中并按下后退按钮时。您可以检查片段堆栈并检查例如

onBackPress(){
childFragmentManager.popbackstack()
val currentFragment = findFragmentByTag("FRAGMENT_B")
if(currentFragment == childFragmentManager.primaryNavigation()){
childFragmentManager.popbackstack()
}

注意

以上代码段是在没有编辑器的情况下编写的。你可以使用这个逻辑。