首页 > 解决方案 > 如何使用Android中的导航控制器组件检测片段是来自前一个片段还是来自之后的片段?

问题描述

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

A --> B --> C 或 D

从片段A,它只能到片段B。但如果我们在片段B,它可以去片段C或片段D。

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

从片段 A 到片段 BI 使用以下代码:

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

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

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

从片段 C 或片段 D,我使用后退按钮返回片段 B。

我试图comesFromFragmentA在导航图中使用安全参数 boolean = true 以表明片段 B 在片段 A 之后。但不幸的是,如果安全参数 booleancomesFromFragmentA来自片段 C 或D.

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

标签: androidandroid-architecture-componentsandroid-jetpackandroid-navigationandroid-architecture-navigation

解决方案


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

// 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)

推荐阅读