组件导航,从带参数的 backstack 弹出

ghi*_*ita 7 navigation android android-fragments kotlin android-architecture-navigation

假设我有三个片段,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)
Run Code Online (Sandbox Code Playgroud)

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

public boolean popBackStack(@IdRes int destinationId, boolean inclusive)
Run Code Online (Sandbox Code Playgroud)

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

Rom*_*pov 5

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

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

在此处查看带有示例的文档。

还有另一种选择,这可能是您描述的情况的开销,但允许使用 popBackStack 方法并发送参数 - 使用“导航返回结果”方法。因为它的片段应该使用接收包的方法实现一个接口(回调)。使用addOnBackStackChangedListener片段中的经理来触发此方法,提供所需的所有数据,popBackStack被调用后。(在“如何返回结果导航?”部分中进行了描述:https : //medium.com/google-developer-experts/using-navigation-architecture-component-in-a-large-banking-app-ac84936a42c2,这里的实现略有不同:https : //medium.com/@zawadz88/david-vávra-thank-you-for-this-great-article-ae3e602b880a

  • 当然,您可以按照 Google 的建议使用共享 ViewModel 来保持片段 B 和 C 可以访问必要的数据,而不是直接在片段之间传递参数。这样你就可以继续使用“popBackStack”。 (2认同)