You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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:

  1. FragmentA 中添加监听(建议在 onViewCreated 中注册):
setFragmentResultListener(FragmentC.REQUEST_KEY) { _, bundle ->
    // 将结果转发给子 Fragment 层级
    childFragmentManager.setFragmentResult(FragmentC.REQUEST_KEY, bundle)
}
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 12:26:07