Android

Fragment Result Api

2021-09-06  本文已影响0人  猿规

重新整理一遍。

2020 年 4 月 29 日,谷哥发布了 androidx.fragment1.3.0 的版本,该版本弃用了之前fragment的传输数据方式,添加了新的api,如下图:

以前的Fragment传输数据都很熟悉,获取fragment实例,arguments,回调,eventbus等,方式的确多样化。

以前大多数传递都需要持有实例,这是很危险的。

但是谷哥已经推新,推荐使用新的api去传递数据,在版本1.3.0-alpha04 中新增了result api去操作。

新api中通过注册监听等方式来进行交互,耦合度低。
result api 同时也包含 startActivityForResult 等api,之前有过一篇文章 Result Api registerForActivityResult

假如你要在两个fragment之间传递,需要用到两个api,一个发送,一个接收。
这里做一个测试,首先启动一个SplashFragment,在启动页结束的时候发送一条数据过去HomeFragment。

添加引用:

implementation "androidx.fragment:fragment-ktx:1.3.0-rc02"

发送:
接收:

这样一看一目了然,两个方法可以直接使用,api点进去可以看到源码

发现是parentFragmentManager中的方法只是kotlin简化了而已。

运行一波,启动页结束进入HomeFragment,然后会在同时收到我们发过去的数据。 Fragment->Fragment 预览图

上面是两个同级Fragment的传递方式。

现在换个场景,Fragment是子集的时候,监听就不一样了。
这里新建一个TabFragment,然后TabFragment里面有两个子tab,现在子tab要传递数据到TabFragment中

还是一样的,在TabFragment里注册好接收。

这里不是直接用parentFragmentManager了,需要用childFragmentManager去注册了,不然会失效。

然后发送还是一样,这里在子tab里显示一个textview,点击textview的时候发送一条数据过来。


运行一波:


子Fragment->Fragment 预览图

在换一个场景。
如果从TabFragment中传递数据到子tab中,子tab去接收

这里为了方便测试,在TabFragment中添加一个悬浮按钮,点击按钮传递数据到子tab中。


这时候发送就不一样了,因为是发送到子tab中,所以需要使用childFragmentManager去发送。

在运行一波看看:
Fragment->子Fragment 预览图
这里需要注意注册的key,不要重复注册,否则只会有一个能接收到数据。

这种方式不持有对方引用,避免了很多未知的问题,自带生命周期的监听,会在销毁的同时移除监听。

总结:

从 Fragment->Fragment;子Fragment->Fragment;Fragment->子Fragment ;
通过新的Result Api,分别对三个不同场景测试,梳理了使用流程。

从startActivityForResult到Fragment,发现新式解耦法基本都是通过注册监听等方式来实现;同时绑定生命周期,这一整套也可以自己封装在平时的一些工具类上,避免重耦合。

上一篇 下一篇

猜你喜欢

热点阅读