组件导航,带参数从后台弹出

Component Navigation , pop from backstack with arguments

假设我有三个片段,A、B、C;

A -> B <-> C

B和C之间是循环关系。 B 或 C 片段需要 arguments,示例

     val args = Bundle()

     args.putString("StringKeyBC", argValueBtoC)       
     findNavController().navigate(R.id.action_fragmentB_to_fragmentC, args, null)

     args.putString("StringKeyCB", argValueCtoB)       
     findNavController().navigate(R.id.action_fragmentC_to_fragmentB, args, null)

问题是每次我在 B 和 C 之间移动时,片段都会添加到返回堆栈,而我不希望这样。如果该片段已经退回堆栈,我只想弹出它,但是如果我使用 popBackStack 我就不能再添加参数了:

public boolean popBackStack(@IdRes int destinationId, boolean inclusive)

那么,如何在不每次都将它们添加到后台堆栈的情况下不断地在两个片段之间切换?

只需将 popUpTo 属性添加到导航操作,您就可以从返回堆栈中弹出片段。通过这种方式,您可以使用带参数的操作进行导航,但具有弹出堆栈行为。

例如,您可以将属性 app:popUpTo="@+id/fragmentB" 添加到操作 action_fragmentC_to_fragmentB。这样,每次从 fragmentC 转到 fragmentB 时,都会从 backstack 中弹出 fragmentC。

See the docs with example for this here.

还有另一个选项,这可能是您描述的情况的开销,但它允许使用 popBackStack 方法并发送参数 - 使用 'navigate back with result' 方法。为此,片段应该使用接收包的方法实现一个接口(回调)。在片段管理器中使用 addOnBackStackChangedListener 来触发此方法,在调用 popBackStack 后提供所有必要的数据。 (在 "How to navigate back with a result?" 节中描述:https://medium.com/google-developer-experts/using-navigation-architecture-component-in-a-large-banking-app-ac84936a42c2, and with slightly different implementation here: https://medium.com/@zawadz88/david-vávra-thank-you-for-this-great-article-ae3e602b880a