前言
就在前段时间,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 的父容器