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

Android中两个Fragment之间传递数据的方式有哪些?哪种更高效?

Fragment 间传递数据的实现方案对比

你提到的 Intent、Navigation Arguments 确实是两种常见的传值方案,除此之外还有以下几种常用实现:

其他可选实现方式

  • 共享 ViewModel:Google 官方首推的同 Activity 下 Fragment 通信方案,两个 Fragment 共享与宿主 Activity 生命周期绑定的同一个 ViewModel 实例。发送方将 EditText 输入的内容存入 ViewModel 中的 LiveData / StateFlow 可观察对象,接收方监听该对象的变化,拿到数据后直接更新 TextView 即可,无需组件间互相持有引用。
  • Fragment Result API:AndroidX 提供的官方跨 Fragment 通信能力,发送方调用 setFragmentResult() 方法把数据封装到 Bundle 中,接收方通过 setFragmentResultListener() 监听对应 key 的结果回调,即可获取传递的内容。该方案支持跨导航栈、不同层级 Fragment 的通信,也支持反向传值场景。
  • 宿主 Activity 中转:通过自定义接口回调,让 Fragment 先把数据传给共同的宿主 Activity,再由 Activity 主动调用目标 Fragment 的方法传递数据。这是比较早期的实现方案,耦合度较高,目前已经很少使用。
  • 全局通信方案:包括 EventBus 等第三方事件总线、系统本地广播等,通过全局发送/订阅事件的方式传递数据。这类方案容易出现内存泄漏、事件滥用、调试难度大的问题,普通传值场景不推荐使用。

最优方案及效率分析

不同场景下的最优选择有区别:

  1. 两个 Fragment 属于同一个宿主 Activity时,共享 ViewModel 是效率最高的方案,核心原因如下:

无需对数据做序列化/反序列化处理,数据直接存储在内存中,读写开销几乎可以忽略;符合 MVVM 架构分层逻辑,数据与 UI 完全解耦,不需要组件间持有对方引用,后期维护成本极低;配置变更(如屏幕旋转)场景下 ViewModel 不会被销毁,传递的数据不会丢失,不需要额外做数据保存恢复操作。

  1. 两个 Fragment 属于不同导航栈、或者需要跨页面反向传值时,Fragment Result API 是更优选择:

比 Intent 传值更轻量,没有启动组件的额外性能开销;比 Navigation Arguments 更灵活,不需要提前在导航图中声明参数类型,支持动态传值,也不需要处理回退栈相关逻辑。

你提到的两种已知方案的适用场景相对局限:Intent 通常仅适用于随 Activity 启动的 Fragment 传初始值,无法用于两个已运行的 Fragment 实时通信;Navigation Arguments 仅支持正向导航时传初始参数,不支持反向传值,灵活性较差。


内容的提问来源于stack exchange,提问作者oyeraghib

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:09:02