BottomNavigation popBackStack() 导航到 startDestination 而不是上一个片段

Posted

技术标签:

【中文标题】BottomNavigation popBackStack() 导航到 startDestination 而不是上一个片段【英文标题】:BottomNavigation popBackStack() navigates to startDestination instead previous fragment 【发布时间】:2020-06-18 05:06:05 【问题描述】:

我在使用 BottomNavigation + Navigation 组件时遇到问题。基本上,当通过底部导航导航到片段时,popBackStack() 会将应用程序带到 startDestination 而不是上一个片段。

class HomeFragment 
...
    bottomNavigation.setupWithNavController(findNavController(R.id.navHost))
...

<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/splashFragment">

    <fragment
        android:id="@+id/splashFragment"
        android:name="SplashFragment"
        android:label="SplashFragment"
        tools:layout="@layout/fragment_splash">
        <action
            android:id="@+id/action_splashFragment_to_A"
            app:destination="@id/A" />
    </fragment>

    <fragment
        android:id="@+id/A"
        android:name="AFragment"
        android:label="AFragment"
        tools:layout="@layout/A">
        <action
            android:id="@+id/action_A_to_B"
            app:destination="@id/B" />
    </fragment>

    <fragment
        android:id="@+id/B"
        android:name="BFragment"
        android:label="BFragment"
        tools:layout="@layout/B">
        <action
            android:id="@+id/actiob_B_to_homeFragment"
            app:destination="@id/homeFragment" /> <!--bottomNavigation implemented in this fragment-->
    </fragment>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/item1" />
    <item
        android:id="@+id/item2" />
    <item
        android:id="@+id/item3" />
</menu>

当我从底部导航导航到 item 框架上的任何一个时,触发 findNavController().popBackStack() 会将应用程序返回到 SplashFragment 并应该返回到 HomeFragment,因为实现了底部导航。

【问题讨论】:

【参考方案1】:

您可以将popBackStack(int destinationId, boolean inclusive) 与这两个参数一起使用。这样,navController 会尝试将控制器的回栈弹出回特定的目的地。

看到这个link。

您还可以选择弹出导航的后台堆栈。

看到这个link。

【讨论】:

感谢您的回答,但findNavController().popBackStack(R.id.homeFragment, true) 不起作用意味着片段不会去任何地方,app:popUpTo="@+id/homeFragment" app:popUpToInclusive="true" 也带回SplashScreen【参考方案2】:

在 Splash 的 onDestroyView 或 Home 的 onCreate 中将 startDestination 设置为 home

findNavController().graph.startDestination = R.id.homeFragment

【讨论】:

以上是关于BottomNavigation popBackStack() 导航到 startDestination 而不是上一个片段的主要内容,如果未能解决你的问题,请参考以下文章

C++用类实现单向单链表的尾插PushBack(),尾删PopBack(),打印PrintSlist()。

C++实现动态顺序表的PushBack(),PopBack(),PushFront(),PopFront(),Find(),Insert

C语言:动态顺序表动态顺序表的初始化打印尾插PushBack尾删PopBack

填充bottomNavigation中的图标

BottomNavigation 下的 Snackbar

如何在 nativescript 应用程序中实现“BottomNavigation”元素?