首页 > 解决方案 > 退出嵌套导航图

问题描述

我有 3 个图表:“主”、“1”和“2”

应用程序开始“主”,我们检查用户是否登录,然后根据登录状态转到“1”或“2”。

这按预期工作。

这是问题:

当用户从“1”或“2”主屏幕单击“返回”时,应用导航回“主”。

这是预期的结果:

当用户从“1”或“2”主屏幕单击“返回”时,应用程序应退出。

如何退出嵌套图的顶级片段?

这是我的“主要”导航图:

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

    <fragment
        android:id="@+id/fragment_main"
        android:name="com.my.app.fragments.MainFragment"
        android:label="MainFragment"
        tools:layout="@layout/fragment_main">
        <action
            android:id="@+id/action_fragment_main_to_logged_out_navigation"
            app:destination="@id/logged_out_navigation"
            app:enterAnim="@anim/nav_default_enter_anim"
            app:exitAnim="@anim/nav_default_exit_anim"
            app:launchSingleTop="true"
            app:popEnterAnim="@anim/nav_default_pop_enter_anim"
            app:popExitAnim="@anim/nav_default_pop_exit_anim"
            app:popUpTo="@+id/main_navigation"
            app:popUpToInclusive="true" />
        <action
            android:id="@+id/action_fragment_main_to_logged_in_navigation"
            app:destination="@id/logged_in_navigation"
            app:enterAnim="@anim/nav_default_enter_anim"
            app:exitAnim="@anim/nav_default_exit_anim"
            app:launchSingleTop="true"
            app:popEnterAnim="@anim/nav_default_pop_enter_anim"
            app:popExitAnim="@anim/nav_default_pop_exit_anim"
            app:popUpTo="@+id/main_navigation"
            app:popUpToInclusive="true" />
    </fragment>
    <include app:graph="@navigation/logged_in_navigation" />
    <include app:graph="@navigation/logged_out_navigation" />
</navigation>

标签: androidandroid-architecture-components

解决方案


为了在嵌套导航图目的地中退出应用程序,只需使用popUpTo并将其设置为 main_nav_graph.xml

例子:

设计

主导航图

XML

<?xml version="1.0" encoding="utf-8"?>
<navigation ...
    android:id="@+id/main_nav_graph.xml"
    app:startDestination="@id/start">

    <fragment
        android:id="@+id/start"
        android:name="com.example.navargs.StartFragment"
        android:label="Start"
        tools:layout="@layout/fragment_start" >
        ...
        <action
            android:id="@+id/action_start_to_navigation"
            app:destination="@id/login_nav_graph"
            app:popUpTo="@+id/main_nav_graph.xml" />

    </fragment>
    <fragment ... />
    <include app:graph="@navigation/login_nav_graph" />
</navigation>

对于一个工作示例,请查看 repo 中的login-flow 分支


推荐阅读