首页 > 解决方案 > Android Navigation 组件 popUpTo 带回弹出的 Fragment

问题描述

请不要将此标记为重复,我已经阅读了这些 SO 问题,但仍然无法 使用导航组件 popUpTo 错误 Android 导航组件 popUpTo 行为 Android Navigation Component + Login Flow + Nested BottomNavigationView

我在用

def nav_version = "2.2.1"
    implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
    implementation "androidx.navigation:navigation-ui-ktx:$nav_version"

场景:这是我的应用图 在此处输入图像描述

这是我的导航代码:

<fragment
        android:id="@+id/splashFragment"
        android:name="com.view.SplashFragment"
        android:label="SplashFragment" >
        <action
            android:id="@+id/action_splashFragment_to_loginFragment"
            app:destination="@id/loginFragment"
            app:popEnterAnim="@anim/slide_in_left"
            app:popExitAnim="@anim/slide_out_right"
            app:enterAnim="@anim/slide_in_right"
            app:exitAnim="@anim/slide_out_left"
            app:popUpTo="@id/loginFragment"
            app:popUpToInclusive="true"/>
        <action
            android:id="@+id/action_splashFragment_to_mainFragment"
            app:destination="@id/mainFragment"
            app:popEnterAnim="@anim/slide_in_left"
            app:popExitAnim="@anim/slide_out_right"
            app:enterAnim="@anim/slide_in_right"
            app:exitAnim="@anim/slide_out_left"
            app:popUpTo="@id/mainFragment"
            app:popUpToInclusive="true"/>
    </fragment>

当我打开时按下后退按钮MainFragment或者LoginFragment我仍然能够导航回splashFragment。我已经有app:popUpToapp:popUpToInclusive标签了。我希望我的应用不要导航回splashFragment

标签: androidandroid-navigationandroid-navigation-graph

解决方案


你在你的popUpTo

根据popUpTo 指南

app:popUpTo告诉导航库在调用navigate(). 属性值是应保留在堆栈中的最新目的地的 ID。

您还可以包括app:popUpToInclusive="true"指示指定的目标app:popUpTo也应该从后台堆栈中删除。

popUpTo应该指向已经在后堆栈上的目标,您要从后堆栈弹出。因此,如果您想将所有内容弹出到splashFragment您应该使用app:popUpTo="@id/splashFragment". 如果您想弹出所有内容,包括splashFragment那么您应该使用app:popUpTo="@id/splashFragment"and app:popUpToInclusive="true"

<fragment
    android:id="@+id/splashFragment"
    android:name="com.view.SplashFragment"
    android:label="SplashFragment" >
    <action
        android:id="@+id/action_splashFragment_to_loginFragment"
        app:destination="@id/loginFragment"
        app:popEnterAnim="@anim/slide_in_left"
        app:popExitAnim="@anim/slide_out_right"
        app:enterAnim="@anim/slide_in_right"
        app:exitAnim="@anim/slide_out_left"
        app:popUpTo="@id/splashFragment"
        app:popUpToInclusive="true"/>
    <action
        android:id="@+id/action_splashFragment_to_mainFragment"
        app:destination="@id/mainFragment"
        app:popEnterAnim="@anim/slide_in_left"
        app:popExitAnim="@anim/slide_out_right"
        app:enterAnim="@anim/slide_in_right"
        app:exitAnim="@anim/slide_out_left"
        app:popUpTo="@id/splashFragment"
        app:popUpToInclusive="true"/>
</fragment>

推荐阅读