无法移动到嵌套子导航组件中的父片段?

Posted

技术标签:

【中文标题】无法移动到嵌套子导航组件中的父片段?【英文标题】:failed to move to parent fragment in nested child navigation component? 【发布时间】:2021-10-01 21:52:45 【问题描述】:

我在我的应用程序中使用具有单个活动和多个片段模式的导航组件,我有一些片段占据整个设备屏幕,其他片段与底部导航组件共享它,并通过我使用的单个活动来实现我的主要活动中的片段容器视图和具有导航片段的主屏幕片段我使用了 RootHomeFragment,它具有另一个带有底部导航视图的片段容器视图。 这里是完整的应用导航图

(nav_main) -->MainActivity 有视图 (main_fragment)--> (SplashFragment - LoginFragment = RootHomeFragment)

(nav_home) --> RootHomeFragment 有视图(home_fragment / 底部导航视图) --> (HomeFragment - SettingFragment)

问题出在 settingFragment 中,有一个注销操作将我重定向到登录屏幕,但我无法执行此操作,我尝试使用 SettingFragment 中的下一个代码执行此操作,但应用程序移动到 HomeFragment 这是nav_home 的默认主页目的地

   Navigation.findNavController(requireActivity(),R.id.fragment_main)
                    .navigate(R.id.actionGoToLoginFromHome)

这是我的 nav_main 的 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/nav_main"
    app:startDestination="@id/splashFragment">

    <action android:id="@+id/action_global_login"
        app:destination="@id/loginFragment"/>

    <fragment
        android:id="@+id/rootHomeFragment"
        android:name="package.main.RootHomeFragment"
        android:label="fragment_root_home"
        tools:layout="@layout/fragment_root_home">
        <action
            android:id="@+id/actionGoToLoginFromHome"
            app:destination="@id/loginFragment"
         />

    </fragment>
    
    <fragment
        android:id="@+id/splashFragment"
        android:name="package.splash.SplashFragment"
        android:label="fragment_splash"
        tools:layout="@layout/fragment_splash">
        <action
            android:id="@+id/actionGoToRootHome"
            app:destination="@id/rootHomeFragment"
            app:launchSingleTop="true"
            app:popUpTo="@id/splashFragment"
            app:popUpToInclusive="true" />
        <action
            android:id="@+id/actionGoToLogin"
            app:destination="@id/loginFragment"
            app:launchSingleTop="true"
            app:popUpTo="@id/splashFragment"
            app:popUpToInclusive="true" />
    </fragment>
    <fragment
        android:id="@+id/loginFragment"
        android:name="package.signinup.LoginFragment"
        android:label="fragment_login"
        tools:layout="@layout/fragment_login">
        <action
            android:id="@+id/actionGoToRootHomeFromLogin"
            app:destination="@id/rootHomeFragment"
            app:launchSingleTop="true"
            app:popUpTo="@id/splashFragment"
            app:popUpToInclusive="true" />
    </fragment>
</navigation>

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

    <fragment
        android:id="@+id/homeFragment"
        android:name="package.main.HomeFragment"
        android:label="fragment_home"
        tools:layout="@layout/fragment_home" />
    <fragment
        android:id="@+id/ordersFragment"
        android:name="package.main.OrdersFragment"
        android:label="fragment_orders"
        tools:layout="@layout/fragment_orders" />
    <fragment
        android:id="@+id/settingFragment"
        android:name="package.main.SettingFragment"
        android:label="fragment_setting"
        tools:layout="@layout/fragment_setting" >

    </fragment>
</navigation>

我从许多答案中尝试了许多解决方案,即使使用 liveData 并在 RootHomeFragment 中观察它并尝试从那里移动到 LoginFragment 它也会移动 RootHomeFramgnet 默认目标 HomeFragment,工作的解决方案总是将我重定向到 homeFragment?有什么解决办法吗?

【问题讨论】:

我明白了,您能否在 SplashScreen / Login 之后显示您当前用于显示 HomeFragment 的代码?谢谢。 【参考方案1】:

这听起来,你导航到 LoginFragment 然后它立即导航回 HomeFragment。

我们需要看看 LoginFragment / 它的 viewModel 中发生了什么。

【讨论】:

登录片段只有一个案例可以回家(如果用户通过身份验证的情况)并且在注销时,偏好登录数据被清除并且用户要求再次登录所以我认为这不是问题,尤其是我测试得很好

以上是关于无法移动到嵌套子导航组件中的父片段?的主要内容,如果未能解决你的问题,请参考以下文章

在导航抽屉管理的片段之间移动

以编程方式嵌套的片段不反映导航上的父生命周期

当返回到“导航架构组件”中的同一选项卡时,嵌套片段的状态会丢失

页眉组件 - 无法让 Vuex 更新嵌套子组件上的存储

如何使用导航组件切换到不同后堆栈中的其他片段?

如何访问活动内部/从活动中的片段视图组件