按返回始终使用喷气背包导航返回起始目的地

问题描述 投票:0回答:2

所以,我已经

BottomNavigationView
与 Jetpack Navigation 绑定在一起。假设我有 4 个底部导航菜单,片段 A、B、C 和 D,A 作为起始目的地。从片段 A 转到片段 B,然后转到片段 C。然后,我按下硬件后退按钮。我期望它返回到片段 B,相反,它返回到片段 A(这是起始目的地)。

这是代码:

val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment_activity_main) as NavHostFragment
navController = navHostFragment.navController

binding.navView.setupWithNavController(navController)

我怎样才能改变这种行为?

谢谢~

编辑: 我遵循 Zain 的回答,行为已经符合预期。但, 还有一个问题。假设我有另一个片段 A1,它不是

BottomNavView
片段的一部分。我可以从片段 A 导航到片段 A1。以下是导航图:

<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/mobile_navigation"
    app:startDestination="@+id/navigation_a">

    <fragment
        android:id="@+id/navigation_a"
        android:name="com.example.FragmentA"
        android:label=""
        tools:layout="@layout/fragment_a">
        <action
            android:id="@+id/action_navigation_a_to_navigation_a1"
            app:destination="@id/navigation_a1"
            app:launchSingleTop="true" />
    </fragment>
    <fragment
        android:id="@+id/navigation_a1"
        android:name="com.example.FragmentA1"
        android:label=""
        tools:layout="@layout/fragment_a1" />
    <fragment
        android:id="@+id/navigation_b"
        android:name="com.example.FragmentB"
        android:label=""
        tools:layout="@layout/fragment_b" />
    <fragment
        android:id="@+id/navigation_c"
        android:name="com.example.FragmentC"
        android:label=""
        tools:layout="@layout/fragment_c" />
    <fragment
        android:id="@+id/navigation_d"
        android:name="com.example.FragmentD"
        android:label=""
        tools:layout="@layout/fragment_d" />
</navigation>

如果我从片段 A 导航到片段 A1,然后导航到片段 B,然后按返回,它会显示正确的片段,即 A1,但 BottomNavigation 仍将片段 B 显示为活动片段,而不是片段 A。

android android-fragments android-architecture-components android-jetpack-navigation
2个回答
5
投票

A 作为起始目的地。从片段 A 转到片段 B,然后转到片段 C。然后,我按下硬件后退按钮。我期望它返回到片段 B,相反,它返回到片段 A(这是起始目的地)。

这是导航架构组件的默认行为;一旦您处理到除起始目标片段之外的另一个片段,所有

BottomNavView
片段都会从返回堆栈中弹出。

为了改变这一点,文档说

默认情况下,返回栈会弹出回导航 图表的起始目的地。菜单项有 android:menuCategory="secondary" 不会弹出后退堆栈。

因此,您需要在除起始目标项之外的所有菜单项中添加

android:menuCategory="secondary"
。在你的例子中,它们是片段 b、c 和 d 项:

<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/fragment_a"
        android:icon="...."
        android:title="A" />

    <item
        android:id="@+id/fragment_b"
        android:menuCategory="secondary"
        android:icon="...."
        android:title="B" />

    <item
        android:id="@+id/fragment_c"
        android:menuCategory="secondary"
        android:icon="...."
        android:title="C" />
        
    <item
        android:id="@+id/fragment_d"
        android:menuCategory="secondary"
        android:icon="...."
        android:title="D" />
        
</menu>

0
投票

如果您希望默认开始片段不应添加到堆栈中,并且当用户按回任何其他导航片段时,活动应该完成,只需对 navhostfragment 容器进行更改即可

app:defaultNavHost="false"
© www.soinside.com 2019 - 2024. All rights reserved.