为什么我无法使用导航组件返回到上一个片段?

Why I cannot go back to previous fragment with Navigation Component?

在我的应用程序中,我有 3 个主屏幕 - 探索、我的群组、个人资料。在我的群组中,我有群组列表,当我点击一个群组时,我被重定向到单个 GroupFragment。那很好用。但是当我想通过手势返回时(从 phone 的右侧到中心)应用程序将进入后台并显示“桌面”。我想从组返回到 MyGroups 片段。

编辑:我可以返回到上一个片段 (MyGroups) 的唯一方法是在组片段中的某个按钮上创建 onClickListener。像那样:

  backButton.setOnClickListener { findNavController().popBackStack() }

为什么我的下面的代码无法正常工作,因为它应该使用手势向后滑动?

nav_dashboard_menu:

<?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"
    android:id="@+id/nav_dashboard_menu"
    app:startDestination="@id/nav_explore">

    <include app:graph="@navigation/nav_explore" />
    <include app:graph="@navigation/nav_my_groups" />
    <include app:graph="@navigation/nav_profile" />

</navigation>

nav_my_groups:

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

    <include app:graph="@navigation/nav_group" />

    <fragment
        android:id="@+id/myGroupsFragment"
        android:name="com.wojciechkula.locals.presentation.mygroups.MyGroupsFragment"
        android:label="My groups"
        tools:layout="@layout/fragment_my_groups">
        <action
            android:id="@+id/openGroup"
            app:destination="@id/nav_group">
            <argument
                android:name="groupId"
                app:argType="string" />
            <argument
                android:name="groupName"
                app:argType="string" />
        </action>
    </fragment>

</navigation>

nav_group:

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

   <fragment
       android:id="@+id/groupFragment"
       android:name="com.wojciechkula.locals.presentation.group.GroupFragment"
       android:label="Group"
       tools:layout="@layout/fragment_group">
       <argument
           android:name="groupId"
           app:argType="string" />
       <argument
           android:name="groupName"
           app:argType="string" />
   </fragment>

</navigation>

我将从 MyGroups 转到带有 navController 和 Destination 的组。 我的群组导航器:

internal class MyGroupsNavigator @Inject constructor() {

    fun openGroup(navController: NavController, id: String, name: String) {
        val destination = MyGroupsFragmentDirections.openGroup(id, name)
        navController.navigate(destination)
    }
}

您也可以使用 OnBackPressDispatcher。但是不要忘记删除 handleOnBackPress 方法中的回调。 here

在 OnViewCreated 中:

requireActivity().onBackPressedDispatcher
            .addCallback(viewLifecycleOwner, object : OnBackPressedCallback(true) {
                override fun handleOnBackPressed() {
                    findNavController().popBackStack()
                }
            })