Fragment Result Api
重新整理一遍。
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中。
这里不是直接用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,发现新式解耦法基本都是通过注册监听等方式来实现;同时绑定生命周期,这一整套也可以自己封装在平时的一些工具类上,避免重耦合。