为全局操作弹出图形 startDestination 片段 - Android 导航组件

Nic*_*zzi 4 navigation android android-jetpack android-architecture-navigation androidx

我有一个多图导航应用程序,我想使用global action根目录中定义的a 在图之间切换main_graph.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/main_graph"
        app:startDestination="@id/loadingFragment">

    <include app:graph="@navigation/learn_graph" />

    <action
            android:id="@+id/action_global_learn_graph"
            app:destination="@id/learn_graph"
            app:launchSingleTop="true"
            />
</navigation>
Run Code Online (Sandbox Code Playgroud)

由于我正在尝试在图形之间切换,因此在将全局操作导航到目标图形 (explore_graph) 时,我想从源图形 (main_graph) 加载的片段中清除返回堆栈。预期的行为是导航到startDestination目标图的片段,仅在后台堆栈中保留该片段。对于正常操作(同一图中的操作),我可以使用popUpTo标志,如何为全局操作获得相同的行为?

Nic*_*zzi 5

经过多次尝试,我找到了解决方案。基本思想是将 backstack 弹出到“拥有”全局动作的图形。在我的情况下main_graph是所有者,所以我做了:

<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/main_graph"
        app:startDestination="@id/loadingFragment">

    <include app:graph="@navigation/learn_graph" />

    <action
            android:id="@+id/action_global_learn_graph"
            app:destination="@id/learn_graph"
            app:popUpTo="@+id/main_graph"
            app:launchSingleTop="true" />

</navigation>
Run Code Online (Sandbox Code Playgroud)

此外,您必须将app:launchSingleTop标志设置true为 以使目标图的实例在您的后台堆栈中是唯一的

您还可以包含app:popUpToInclusive="true"以指示 中指定的目标app:popUpTo也应从返回堆栈中删除