Android 导航组件单任务启动片段导航

Android 导航组件单任务启动片段导航,android,android-xml,android-navigation,android-launcher,android-navigation-graph,Android,Android Xml,Android Navigation,Android Launcher,Android Navigation Graph,我正在使用导航组件构建我的应用程序。我想在片段导航中实现SingleTask启动模式,我如何实现它 为了更清楚,我将详细说明我的问题 我有一个HomeFragement(让片段a),从中我定义了内部屏幕的操作 片段A>片段B>片段C>片段D 我有一个BaseFragment,它扩展了上面所有的片段,在这些片段中,我使用findNavController().popBackStack()实现了back click及其操作 在片段D中,当用户按预期单击“后退”按钮时,它将导航回片段C。当我调用了一个

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

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

我有一个HomeFragement(让片段a),从中我定义了内部屏幕的操作

片段A>片段B>片段C>片段D

我有一个BaseFragment,它扩展了上面所有的片段,在这些片段中,我使用
findNavController().popBackStack()实现了back click及其操作

在片段D中,当用户按预期单击“后退”按钮时,它将导航回片段C。当我调用了一个目标片段为片段A的操作时,我的问题就出现了。我在片段D中的一个成功事件上调用此操作,该操作也可以正常工作。但是当用户从片段A按下后退按钮时,它会转到片段C,下一次后退单击会转到片段B,然后下一次后退单击会转到片段A。我应该在片段D中调用的成功事件中销毁片段B和片段C,并应该恢复片段A

我知道,如果启动模式是第一个屏幕(片段A)的SingleTask,而不是片段,则可以实现此流程

我的导航图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>

但是当用户从片段A按下后退按钮时,它进入片段C,下一次后退单击进入片段B,然后下一次后退单击进入片段A

如果我理解正确,您的片段A是起始目的地,就像主页一样,并且您想要“每当我返回片段A,我单击的下一步返回按钮应退出应用程序”的行为,对吗

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

app:popUpTo="@id/fragmentA"
app:popUpToInclusive="true" />
应该是这样的:


演示:

发布我的工作解决方案,完整的导航脚本,其中包括@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>


你能提供一个有明确目标/期望的具体例子吗?@SamChen我已经添加了代码片段,请看我的编辑,它正在工作,兄弟。。。。所以我把我的解决方案作为一个答案