使用Fragment Result API时,FragmentC向FragmentA1传值失败如何解决?
Fragment Result API跨层级传递结果失败的解决方法
问题场景
页面结构:Activity 容器包含 FragmentA、FragmentB、FragmentC,FragmentA 通过 childFragmentManager 管理子 FragmentA1。需要实现从 FragmentC 向 FragmentA1 传递结果,但当前代码无法触发 FragmentA1 的回调。
当前代码
FragmentC 发送结果的代码:
setFragmentResult( requestKey = REQUEST_KEY, result = bundleOf( RESULT_CATEGORY_ID to it.id, ), )
FragmentA1 注册监听的代码(onCreate 方法中):
setFragmentResultListener( FragmentC.REQUEST_KEY, ) { _, bundle -> // handle result }
问题原因
Fragment Result API 默认仅在同一个 FragmentManager 层级内传递结果:
- FragmentC 属于 Activity 的
supportFragmentManager层级 - FragmentA1 属于 FragmentA 的
childFragmentManager层级
两者不在同一层级,因此 FragmentA1 的监听无法接收到 FragmentC 发送的结果。
修复方案
方案一:通过 FragmentA 中转结果
利用 FragmentA 作为中间层,接收 Activity 层级的结果后转发给子 FragmentA1:
- FragmentA 中添加监听(建议在
onViewCreated中注册):
setFragmentResultListener(FragmentC.REQUEST_KEY) { _, bundle -> // 将结果转发给子 Fragment 层级 childFragmentManager.setFragmentResult(FragmentC.REQUEST_KEY, bundle) }
- FragmentA1 修改监听层级,监听自身所在的
childFragmentManager:
childFragmentManager.setFragmentResultListener(FragmentC.REQUEST_KEY, viewLifecycleOwner) { _, bundle -> // 处理结果 val categoryId = bundle.getLong(FragmentC.RESULT_CATEGORY_ID) // 执行业务逻辑 }
方案二:FragmentA1 直接监听 Activity 的 FragmentManager
跳过中转,让 FragmentA1 直接监听 Activity 层级的结果,注意绑定正确的生命周期避免泄漏:
// FragmentA1 的 onCreate 或 onViewCreated 中 requireActivity().supportFragmentManager.setFragmentResultListener( FragmentC.REQUEST_KEY, viewLifecycleOwner // 绑定视图生命周期,防止内存泄漏 ) { _, bundle -> // 处理结果 }
内容的提问来源于stack exchange,提问作者testivanivan
相关产品推荐
相关产品推荐

