如何使用Android中的导航控制器组件检测片段是来自先前的片段还是来自随后的片段?

时间:2019-06-28 02:10:37

标签: android android-architecture-components android-jetpack android-navigation android-architecture-navigation

我正在使用导航控制器组件。假设我有4个片段

A-> B-> C或D

从片段A开始,它只能转到片段B。但是,如果我们在片段B中,则可以转到片段C或片段D。

如果它来自片段A,我想在onResume片段B中执行方法workXYZ(),如果我来自片段C或片段D,我想在onResume片段B中执行方法doSomethingABC()。 / p>

从片段A到片段B,我使用以下代码:

val BDestination = FragmentADirections.actionToFragmentB()
Navigation.findNavController(fragmentView).navigate(BDestination)

要到达片段C和片段B中的片段D,我使用了全局操作。因为片段C和D实际上不仅由片段B使用,所以我使用下面的代码进入片段C或D

val CDestination = BFragmentDirections.actionGlobalFragment()
Navigation.findNavController(fragmentView).navigate(CDestination)

然后从片段C或片段D中,使用“后退”按钮回到片段B。

我试图在导航图中使用安全参数boolean comesFromFragmentA = true,以便给出片段B紧随片段A之后的信号。但是不幸的是,安全参数boolean comesFromFragmentA的值将如果来自片段C或D,则保持相同(真)。

那么,如果想知道片段B是出现在前一个片段之后还是之后,该怎么办?

1 个答案:

答案 0 :(得分:2)

片段参数是可变的,因此您可以随时更改它们。因此,您可以在导航以表示将来的onResume()调用将在返回该片段之后立即更新该参数值:

// Set the comesFromFragmentA argument to signify that the next onResume()
// will be when you come back to this Fragment
arguments.putBoolean("comesFromFragmentA", false)

// Now navigate
val CDestination = BFragmentDirections.actionGlobalFragment()
Navigation.findNavController(fragmentView).navigate(CDestination)