假设我有三个片段,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
。这样,每次从片段C转到片段B时,您都会从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(