导航组件 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" />
它应该是这样的:
发布我的工作解决方案,包括@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>
我正在使用导航组件构建我的应用程序。我想在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" />
它应该是这样的:
发布我的工作解决方案,包括@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>