android - 如何使用 Android 导航组件将值传递回先前的片段目标?
问题描述
坐下来,我有一些这样的目的地
从片段 A --> 到片段 B --> 到片段 C
我可以使用安全参数将数据从片段 A 传递到片段 B。也可以使用安全参数从片段 B 到片段 C。
如果我想将片段 C 中生成的字符串带回片段 B 或片段 A 怎么办?
从片段 C 导航到片段 B,我使用代码:
Navigation.findNavController(fragmentView).navigateUp()
并从片段 C 导航到片段 A,我使用代码:
Navigation.findNavController(view).popBackStack(R.id.fragmentA, false)
那么如何将值传递回先前的片段目标?我是否必须从片段 C 回到片段 B 并通过安全 args 传递值?
真的需要你的帮助。非常感谢 :)
解决方案
您可以使用以下代码段将数据发送到前一个片段。
片段 A 观察数据:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData<String>("key")?.observe(viewLifecycleOwner) { data ->
// Do something with the data.
}
}
片段 B 发送数据:
findNavController().previousBackStackEntry?.savedStateHandle?.set("key", data)
findNavController().popBackStack()
我也为此写了扩展。
fun <T : Any> Fragment.setBackStackData(key: String,data : T, doBack : Boolean = true) {
findNavController().previousBackStackEntry?.savedStateHandle?.set(key, data)
if(doBack)
findNavController().popBackStack()
}
fun <T : Any> Fragment.getBackStackData(key: String, result: (T) -> (Unit)) {
findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData<T>(key)?.observe(viewLifecycleOwner) {
result(it)
}
}
用法:
片段 A:
getBackStackData<String>("key") { data ->
// Do something with the data.
}
片段 B:
setBackStackData("key",data)
注意:我使用字符串作为数据。您可以使用任何其他类型的变量。
注意:如果您要使用 Class 作为数据,请不要忘记添加@Parcelize
annotation 和 extend Parcelable
。
推荐阅读
- ip-address - 如何在 Azure VMSS 中为单个 NIC 创建多个 IP 地址
- javascript - 如何对chart.js饼图的每个弧段的borderColor进行更多控制
- python - 根据其他列中的值替换列值
- swiftui - 设置带有几何阅读器的 ScrollView 时是否会出现无限循环?
- c# - UWP - 基于主题的初始屏幕颜色
- html - 使用动画属性模拟对象拟合
- java - 如何在运行时不“中断”方法的执行
- ffmpeg - ffmpeg - 复制附加字体而不编码/remux
- javafx - Javafx 应用程序在关闭后仍在后台运行
- php - 无论输入如何,如何使用 preg_replace?