如何找出前一个片段正在使用导航组件

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

在片段的后按防止使用导航图调用前一个片段的 onViewCreated