如何使用导航组件找到上一个片段是什么

9
我想找出回退栈中的前一个片段,如果它是我想要的那个,则回到该片段,否则转到另一个片段。我在寻找我的前一个片段的名称/ID方面遇到了问题。我的当前设置如下:
Fragment 1 -> Fragment 2 -> Fragment 3 如果 Fragment 3 的前一个ID > Fragment 2,则使用参数返回到它。
但我也会遇到这种情况:
Fragment 4 -> Fragment 3 在这里,我还想能够检查 Fragment 3 的前一个ID/名称是否等于 Fragment 4,如果是的话就带着参数返回到该片段。
基本上,Fragment 3将有不同的路线走出它,我想确定它将去到哪个前一个片段。
我的问题是我无法访问以前的片段的信息,以检查是否可能实现上述内容。我刚开始使用Android Navigation组件,因此任何帮助都将不胜感激。
如果问题似乎有点混乱,请告诉我,我可以重写它。
谢谢!

1
这不是你应该将结果返回到先前的片段的方式,请参见现有功能请求的评论 - ianhanniballake
2个回答

1
您可以使用 previousBackStackEntry 方法,该方法返回一个NavBackStackEntry对象,它是:

回退栈中上一个可见条目,如果回退栈中的可见条目少于两个,则返回 null。

要获取上一个目标的 ID,请使用:previousBackStackEntry.destination.id,但由于它是可空的,因此请使用 previousBackStackEntry?.destination?.id

在您的场景中应用:

在 Fragment 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
    }
}

这将仅返回未使用pop操作的ID。如果前一个片段使用弹出堆栈的操作(从详细视图返回通常会发生这种情况),则该ID将代替先前的ID成为“上层”(钻取的较少详细级别)ID,而不是先前的ID。该方法命名不正确。 - Henrik Erlandsson

0
一种解决这个问题的方法是从前一个片段中将一个键作为参数传递,以便在当前片段中,您将检查传递了什么键并根据其行动。例如,片段A和B都导航到片段C,并且您希望根据先前的情况在片段C中执行操作。您可以做的是使片段C接受一个参数“fragmentOrigin”,然后根据前面的片段将参数设置为“fragmentA”或“fragmentB”。这样,在片段C中,您可以检查fragmentOrigin == fragment A; {Do something} else if fragmentOrigin == fragment B {Do something else}

感谢您的回答。虽然提出的解决方案可以正常工作,但我相信应该有更好的方法。 - Ehsan Ghasaei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接