【问题标题】:Android Navigation component popUpTo taking back to popped up fragmentAndroid Navigation 组件 popUpTo 带回弹出的 Fragment
【发布时间】:2020-05-08 03:01:52
【问题描述】:

请不要将此标记为重复,我已经阅读了这些 SO 问题,但仍然无法正常工作 navigation component popUpTo bug Android navigation component popUpTo behaviour 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>

当我在MainFragmentLoginFragment 上按下返回按钮时,我仍然能够导航回splashFragment。我已经有 app:popUpToapp:popUpToInclusive 标签了。我希望我的应用不要导航回splashFragment

【问题讨论】:

  • 为什么你有一个飞溅片段作为你的图表的起始目的地?这特别不遵循Principles of Navigationguide to Conditional Navigation for login
  • 感谢您的参考。这只是一个测试 POC 来弄清楚这些导航标签是如何工作的,这就是我没有遵循你提到的指南的原因。这里的想法只是为了快速测试一些东西。

标签: android android-navigation android-navigation-graph


【解决方案1】:

您在 popUpTo 中使用了错误的 ID

根据popUpTo guide

app:popUpTo 告诉导航库在调用navigate() 时从返回堆栈中弹出一些目的地。属性值是应保留在堆栈中的最新目的地的 ID。

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

popUpTo 应该指向已经在后堆栈上的目标,您要从后堆栈弹出。因此,如果您想弹出所有内容直到splashFragment,您应该使用app:popUpTo="@id/splashFragment"。如果您想弹出所有内容直到并包括splashFragment,那么您应该使用app:popUpTo="@id/splashFragment"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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多