假设我有三个片段,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)
那么,我如何在两个片段之间进行常量切换而又不必每次都将它们添加回堆栈?
答案 0 :(得分:0)
只需向导航操作添加popUpTo
属性,即可从后堆栈弹出片段。通过这种方式,您可以使用带有参数的操作进行导航,但是具有弹出式堆栈行为。
例如,您可以将属性app:popUpTo="@+id/fragmentB"
添加到操作action_fragmentC_to_fragmentB
中。这样,每次从fragmentC到fragmentB时,都会从堆栈中弹出fragmentC。
还有另一个选项,这可能是您描述的情况的开销,但是允许使用popBackStack方法并发送参数-使用“返回结果的导航”方法。为此,片段应使用接收包的方法实现接口(回调)。在调用popBackStack之后,使用片段管理器中的addOnBackStackChangedListener
触发此方法,并提供所有必需的数据。 (此处在“如何返回结果?”一节中进行了描述: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)