android - 如何使用导航架构组件从片段中获取结果?
问题描述
假设我们有两个片段:MainFragment
和SelectionFragment
。第二个是为选择一些对象而构建的,例如一个整数。从第二个片段接收结果有不同的方法,如回调、总线等。
现在,如果我们决定使用导航架构组件来导航到第二个片段,我们可以使用以下代码:
NavHostFragment.findNavController(this).navigate(R.id.action_selection, bundle)
wherebundle
是Bundle
(当然)的一个实例。如您所见SelectionFragment
,我们无法访问可以放置回调的位置。问题是,如何使用导航架构组件接收结果?
解决方案
他们在 2.3.0-alpha02 版本中为此添加了修复程序。
如果从Fragment A导航到Fragment B并且A需要来自B的结果:
findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData<Type>("key")?.observe(viewLifecycleOwner) {result ->
// Do something with the result.
}
如果在Fragment B上并且需要设置结果:
findNavController().previousBackStackEntry?.savedStateHandle?.set("key", result)
我最终为此创建了两个扩展:
fun Fragment.getNavigationResult(key: String = "result") =
findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData<String>(key)
fun Fragment.setNavigationResult(result: String, key: String = "result") {
findNavController().previousBackStackEntry?.savedStateHandle?.set(key, result)
}
推荐阅读
- python-3.x - 使用 Scipy 的反卷积函数对皮肤电活动数据进行反卷积
- mysql - 创建插入函数
- r - R:更改轴标签的比例和格式
- java - 在 MockMvc 测试中从 Spring Security 模拟 OAuth2AuthenticationToken
- kubernetes - 如何在 Google Cloud Platform VM 上启用 VT-X/AMD-v?
- vuetify.js - 停止 v-data-table 中标题槽中的 v-icon 旋转
- java - 印度手机号码的正则表达式 (Java)
- python - ValueError 兼容性和多行字符串美学?
- java - block()/blockFirst()/blockLast() 在 exchange() 之后调用 bodyToMono 时出现阻塞错误
- visual-studio-code - 刚刚在我的文件上修改了哪个扩展名?