导航组件 SingleTask 启动片段导航

Navigation component SingleTask launching of fragment navigation

我正在使用导航组件构建我的应用程序。我想在fragment navigation中实现SingleTask启动模式,如何实现?

为了更清楚,我将详细说明我的问题。

我有一个 HomeFragement(Lets Fragment A) 并从中定义了对内部屏幕的操作

Fragment A > Fragment B > Fragment C > Fragment D

我有一个 BaseFragment,它扩展了上述所有片段,我在其中使用 findNavController().popBackStack()

实现了后退点击及其操作

在 Fragment D 中,当用户按预期单击后退按钮时,它将导航回 Fragment C。当我调用目标片段为 Fragment A 的操作时,我的问题就来了。我在成功调用此操作时片段 D 中的事件,该操作也很有效。但是,当用户按下 Fragment A 的后退按钮时,它会转到 Fragment C,下一次后退单击会转到 Fragment B,然后下一次后退单击会转到 FRagment A。我应该在 Fragment 中调用的成功事件中销毁 Fragment B 和 Fragment C D 并且应该恢复片段 A.

我知道这个流程可以通过使用第一个屏幕(片段 A)的 SingleTask 启动模式来实现,如果它是 Activity而不是片段。

我的导航图XML文件

<?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/app_navigation"
    app:startDestination="@id/fragmentA">

    <fragment

        android:id="@+id/fragmentA"
        android:name="FragmentA"
        
        tools:layout="@layout/fragment_a">
        <action
            android:id="@+id/action_FragmentA_to_FragmentB"
            app:destination="@id/dashboardFragment"
            app:launchSingleTop="true"
            app:popUpTo="@+id/main_nav_graph"
            app:popUpToInclusive="true" />
    </fragment>
   <fragment

        android:id="@+id/fragmentB"
        android:name="FragmentB"
        
        tools:layout="@layout/fragment_b">
        <action
            android:id="@+id/action_FragmentB_to_FragmentC"
            app:destination="@id/dashboardFragment"
            app:launchSingleTop="true"
            app:popUpTo="@+id/main_nav_graph"
            app:popUpToInclusive="true" />
    </fragment>
<fragment

        android:id="@+id/fragmentC"
        android:name="FragmentC"
        
        tools:layout="@layout/fragment_c">
        <action
            android:id="@+id/action_fragemntC_to_fragementA"
            app:launchSingleTop="true"
            app:popUpToInclusive="true"
            app:destination="@id/deliveriesFragment" />
    </fragment>
   </navigation>

But when the user press the back button from Fragment A it goes to Fragment C, the next back click goes to Fragment B, then the next back click to FRagment A.

如果我理解正确,你的 片段 A 是开始目的地,就像一个主页,你想要“每当我回到 片段 A,我点击的下一个后退按钮应该会退出应用程序”,对吗?

如果是这样,请尝试将 action 从任何 片段 添加到 片段 A 并设置:

app:popUpTo="@id/fragmentA"
app:popUpToInclusive="true" />

它应该是这样的:

演示:https://youtu.be/LNyk_FEkZoA

发布我的工作解决方案,包括@Sam Chen 的答案的完整导航脚本

<?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/app_navigation"
    app:startDestination="@id/fragmentA">

    <fragment

        android:id="@+id/fragmentA"
        android:name="FragmentA"
        
        tools:layout="@layout/fragment_a">
        <action
            android:id="@+id/action_FragmentA_to_FragmentB"
            app:destination="@id/dashboardFragment"
            app:launchSingleTop="true"
            app:popUpTo="@+id/main_nav_graph"
            app:popUpToInclusive="true" />
    </fragment>
   <fragment

        android:id="@+id/fragmentB"
        android:name="FragmentB"
        
        tools:layout="@layout/fragment_b">
        <action
            android:id="@+id/action_FragmentB_to_FragmentC"
            app:destination="@id/dashboardFragment"
            app:launchSingleTop="true"
            app:popUpTo="@+id/main_nav_graph"
            app:popUpToInclusive="true" />
    </fragment>
<fragment

        android:id="@+id/fragmentC"
        android:name="FragmentC"
        
        tools:layout="@layout/fragment_c">
        <action
            android:id="@+id/action_fragemntC_to_fragementA"
            app:popUpToInclusive="true"
            app:popUpTo="@id/fragmentA" />
    </fragment>
</navigation>