全新的Fragment通信方式

前言

就在前段时间,Google 推出了 Fragment Result API 和 Activity Results API,用来取代之前的 Activity 和 Fragment 之间通信方式的不足,大家可以前往看看都有那些更新:
https://medium.com/androiddevelopers/now-in-android-17-9d73f7bed7f

通过Fragment Result API进行Fragment间数据传递:

发送数据

@Override
@NonNull
public final @Override void setFragmentResult(@NonNull String requestKey, @NonNull Bundle result)

如果 FragmentB 发送数据给 FragmentA,需要在 FragmentA 中注册 listener,通过 parent FragmentManager 发送数据

数据接收:

@Override
@NonNull
public final @Override void setFragmentResultListener(
    @NonNull String requestKey,
    @NonNull LifecycleOwner lifecycleOwner,
    @NonNull FragmentResultListener listener
)

如果想在 Fragment 中接受数据,可以在 FragmentManager 中注册一个 FragmentResultListener,参数 requestKey 可以过滤掉 FragmentManager 发送的数据

setFragmentResultListener为给定的requestKey设置了ResultListener。一旦给定的 LifecycleOwner 至少处于 STARTED 状态, setFragmentResult 使用相同的 requestKey 设置的任何结果都将传递给回调。 回调将保持活动状态,直到 LifecycleOwner 达到 DESTROYED 状态或使用相同的 requestKey 调用 clearFragmentResultListener。

时序图分析:

可以通过简化后的时序图来分析lifecycle状态和fragment设置监听的顺序:

  • 如果监听 Fragment 的生命周期,您可以在接收到新数据时安全地更新 UI,因为 view 的创建(onViewCreated() 方法在 onStart() 之前被调用)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s5O477qh-1635469496044)(https://raw.githubusercontent.com/emsuperdan/PeopleCom/master/fragment1.png)]

  • 当生命周期处于 LifecycleOwner STARTED 的状态之前,如果有多个数据传递,只会接收到最新的值:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JRwHFncE-1635469496046)(https://raw.githubusercontent.com/emsuperdan/PeopleCom/master/fragment2.png)]

  • 当生命周期处于 LifecycleOwner DESTROYED 时,它将自动移除 listener,如果想手动移除 listener,需要调用 FragmentManager.setFragmentResultListener() 方法,传递空的 FragmentResultListener

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gKi92E7z-1635469496048)(https://raw.githubusercontent.com/emsuperdan/PeopleCom/master/fragment3.png)]

从时序图很明显可以总体分析出流程来,大致是在FragmentManager中注册listener,依赖于Fragment发送返回的数据。

不同层级关系的Fragment数据传递

一般fragment数据传递涉及到不同层级间的传递,主要分为下面两种:

父子层级的两个Fragment数据传递

如果在 FragmentA 中接受 FragmentB 发送的数据,FragmentA 是 FragmentB 的父容器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值