如何在不丢失 "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
我打开了一些主片段 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