如何找出前一个片段正在使用导航组件
Posted
技术标签:
【中文标题】如何找出前一个片段正在使用导航组件【英文标题】:How to find out what the previous fragment was using the navigation component 【发布时间】:2019-10-16 08:05:08 【问题描述】:我试图找出前一个片段在后台堆栈中是什么,如果它是我想要的那个,那么回到那个片段,否则转到另一个片段。我在查找上一个片段的名称/ID 时遇到问题。我目前的设置如下:
Fragment 1 -> Fragment 2 -> Fragment 3 如果 Fragment 3 的前一个 id 是 >Fragment 2 然后返回它的参数。
但我也会遇到这种情况:
Fragment 4 -> Fragment 3 这里我希望能够检查 Fragment 3 的先前 id/name 是否等于 Fragment 4,以及它是否返回到带有参数的 Fragment。
基本上,片段 3 将有不同的路径,我希望能够确定它将去往下一个之前的片段。
我的问题是我无法从以前的片段中获取信息。检查是否有任何可能。我是使用 android 导航组件的新手,因此不胜感激。
如果问题看起来有点令人困惑,请告诉我,以便我在需要时重写它。
谢谢!
【问题讨论】:
这不是您将结果返回到前一个片段的方式,请参阅the comments on the existing feature request。 【参考方案1】:解决此问题的一种方法是将键作为参数从前一个片段传递,以便在当前片段中检查传递的键并根据它进行操作。例如。 Fragment A 和 B 都导航到 Fragment C,并且您想根据前面的场景在 Fragment C 中进行操作。你可以做的是让片段 C 接受一个参数“fragmentOrigin”,然后根据前面的片段将参数设置为“fragmentA”或“fragmentB”。这样,在片段 C 中,您可以检查 fragmentOrigin == fragment A; Do something else if fragmentOrigin == fragment B Do something else
【讨论】:
感谢您的回答。虽然建议的解决方案效果很好,但我相信应该有更好的方法。【参考方案2】:您将使用previousBackStackEntry,它返回一个NavBackStackEntry
,即:
返回堆栈上的前一个可见条目,如果返回堆栈的可见条目少于两个,则返回 null
要获取上一个目的地的 id,请使用:previousBackStackEntry.destination.id
,但由于它可以为空,请使用 previousBackStackEntry?.destination?.id
在你的场景中应用它:
在片段 3 中:
val previousFragment = findNavController().previousBackStackEntry?.destination?.id
previousFragment?.let
when (previousFragment)
R.id.fragment_2_id ->
// The previous fragment is Fragment 2
R.id.fragment_4_id ->
// The previous fragment is Fragment 4
else ->
// The previous fragment is neither Fragment 2 nor 4
【讨论】:
以上是关于如何找出前一个片段正在使用导航组件的主要内容,如果未能解决你的问题,请参考以下文章
如何使用底部导航视图和 Android 导航组件将参数传递给片段?
如何使用 JetpackNavigation 组件从 BottomSheetDialogFragment 导航到另一个 Fragment