如何在不返回片段 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
- 片段 A -> 片段 B -> 片段 D
- 片段 A -> 片段 C -> 片段 D
在片段 D 上,我有一个用于验证修改和完成的按钮。
从这个 Frgament D 我想:
- return到Fragment B当我来自Fragment B时(我用
findNavController().navigateUp()
)
- 从片段C回来再回到片段A(我不知道怎么做)
从Fragment D过来不返回Fragment C,如何直接返回Fragment A?
我是否应该等待片段 C 上的 return 并重新处理以执行 findNavController().NavigateUp()
。
我在 NavOptions 上使用 setPopUpTo,或者您也可以在 xml 中使用它
您可以通过 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()
}
注意
以上代码段是在没有编辑器的情况下编写的。你可以使用这个逻辑。
我使用 Android 导航架构组件。
我有三个片段 A、B 和 C
- 片段 A -> 片段 B -> 片段 D
- 片段 A -> 片段 C -> 片段 D
在片段 D 上,我有一个用于验证修改和完成的按钮。 从这个 Frgament D 我想:
- return到Fragment B当我来自Fragment B时(我用
findNavController().navigateUp()
) - 从片段C回来再回到片段A(我不知道怎么做)
从Fragment D过来不返回Fragment C,如何直接返回Fragment A?
我是否应该等待片段 C 上的 return 并重新处理以执行 findNavController().NavigateUp()
。
我在 NavOptions 上使用 setPopUpTo,或者您也可以在 xml 中使用它
您可以通过 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()
}
注意
以上代码段是在没有编辑器的情况下编写的。你可以使用这个逻辑。