如何在不丢失 "parent" 状态的情况下弹出 NavController 中的片段堆栈

How to pop through fragment stack in NavController without loosing "parent" state

我打开了一些主片段 FragA,然后可以打开其他片段,这些片段被添加到堆栈中,但是当我按回键时,我显示了一个 DialogC,它应该清除堆栈并且让我回到 FragA,在不丢失它的状态的情况下,从堆栈中恢复它,而不是创建它 - 要重新创建它,我必须通过整个堆栈传递一些 arg。 我在不同的地方尝试了一些带有 popUpTo 的配置,并且还使用了 findNacController.popUpTo(with/out_aruments)findNavController.navigate(R.id.action_dialog_c_to_frag_a) 而没有在操作中定义 destination ,但是 pop 在堆栈中找不到操作,导航需要在定义目标时重新创建片段,否则无法在堆栈中找到弹出操作 (I/NavController: Ignoring popBackStack to destination frag_a as it was not found on the current back stack)

这是我的样本 nav_graph:

<?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">
        <fragment
            android:id="@+id/asdf"
            android:name="SomeNaviFragment">
                <action
                    android:id="@+id/action_asdf_to_frag_a"
                    app:destination="@id/frag_A" />
        </fragment>
        <fragment
            android:id="@+id/frag_A"
            android:name="FragA">
        <argument
            android:name="some_id"
            app:argType="integer" />
        <action
            android:id="@+id/action_frag_a_to_frag_b"
            app:destination="@id/frag_B" />
        </fragment>
        <fragment
            android:id="@+id/frag_B"
            android:name="FragB">
        <action
            android:id="@+id/action_frag_b_to_dialog_frag_c"
            app:destination="@id/DialogFragC"/>
        </fragment>
        <dialog
            android:id="@+id/DialogFragC"
            android:name="DialogC">
                <action
                    android:id="@+id/action_dialog_c_to_frag_a"
                    app:popUpTo="@id/frag_a"
                    app:popUpToInclusive="true"/>
        </dialog>
</navigation>

简而言之 - 我不想通过一些片段从 FragA 开始更深入,但是当 DialogC 在某些时候出现时,我想回到 FragA , 到它的初始状态。是否可以在不传递 FragA 的创建参数的情况下实现它? 一些解决方案已经尝试过,例如:Navigate Back with Navigation Component 及其链接资源,但这根本没有帮助。

我使用了您 post 中的文章来制作此 https://github.com/yoobi/backNavigation 希望对您有所帮助。

编辑:您正在寻找这篇文章和文章的组合。

  • 操作的 popUpTo 属性 "pops up" 在导航之前返回给定目的地。 (目的地已从返回堆栈中删除。)

  • 如果 popUpToInclusive 属性为 false 或未设置,popUpTo 删除指定目的地之前的目的地,但将指定目的地留在返回堆栈中。

  • 如果 popUpToInclusive 设置为 true,则 popUpTo 属性会从返回堆栈中删除所有目的地,包括给定目的地。

  • 如果 popUpToInclusive 为真且 popUpTo 设置为应用程序的起始位置,该操作将从返回堆栈中删除所有应用程序目的地。后退按钮将用户带出应用程序。

您还可以通过以下方式检查您的 backstack 计数:parentFragmentManager.backStackEntryCount