提问人:ghita 提问时间:8/17/2019 更新时间:4/23/2020 访问量:11349
组件导航,从带有参数的后退堆栈弹出
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
例如,您可以将属性添加到操作 中。这样,每次从 fragmentC 转到 fragmentB 时,您都会从 backstack 中弹出 fragmentC。app:popUpTo="@+id/fragmentB"
action_fragmentC_to_fragmentB
还有另一个选项,对于您描述的情况来说,这可能是开销,但它允许使用 popBackStack 方法并发送参数 - 使用“使用结果导航回来”方法。对于它,片段应该使用接收捆绑包的方法实现一个接口(回调)。在片段管理器中使用以触发此方法,并在调用 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-ae3e602b880aaddOnBackStackChangedListener
)
评论
popBackStack
评论