Activity 与 Fragment 通信方式
转载请注明出处:Android 解忧杂货店
主页:https://pangrongxian.github.io/
(一)Handler
(二)广播
(三)EventBus
(四)接口回调
(五)Bundle和setArguments(bundle)
通常,Fragment 与 Activity 通信存在三种情形:
- Activity 操作内嵌的 Fragment,
- Fragment 操作宿主 Activity,
- Fragment 操作同属 Activity中的其他 Fragment。
由于 Activity 持有所有内嵌的 Fragment 对象实例。(创建实例时保存的 Fragment 对象,或者通过 FragmentManager 类提供的findFragmentById()和findFragmentByTag() 方法也能获取到 Fragment 对象),所以可以直接操作Fragment。Fragment 通过 getActivity() 方法可以获取到宿主 Activity 对象(强制转换类型即可),进而可以操作宿主 Activity;那么很自然的,获取到宿主 Activity 对象的 Fragment 便可以操作其他Fragment 对象。
虽然上述操作已经能够解决 Activity 与 Fragment 的通信问题,但会造成代码逻辑紊乱的结果,极度不符合这一编程思想:高内聚,低耦合。Fragment 做好自己的事情即可,所有涉及到 Fragment 之间的控制显示等操作,都应交由宿主 Activity 来统一管理。
(一)Handler
|
|
- Fragment对具体的Activity存在耦合,不利于Fragment复用
- 不利于维护,若想删除相应的Activity,Fragment也得改动
- 没法获取Activity的返回数据
(二)广播
在 Activity 中注册广播接收器,在 Fragment中发送广播
|
|
(三)EventBus
MainActivity
1.注册订阅者(事件接收者)
|
|
|
|
2.定义处理接收方法(事件处理)
|
|
SecondActivity
3.发送事件
|
|
(四)接口回调
- 在 Fragment 中定义一个接口
- 调用接口中的抽象方法
- 在 Activity 中实现接口,并具体实现接口中的方法,完成通信。
|
|
|
|
(五)Bundle和setArguments(bundle)
- Fragment 从Activity获取数据
在Fragment 中的 getInstance() 方法中 setArguments() 设置参数
|
|
再通过getArguments()方法获取数据
|
|
Activity 中,在创建Fragment对象的时候,调用Fragment的getInstance方法获取对象,并传递参数。
|
|
补充:
Fragment && Fragment 数据交互
Fragment和Fragment间数据交互,应该也是会经常用到的。第一时间,我们可能本能地会想到使用宿主Activity做传递媒介。原理其实也是通过使用onActivityResult回调,完成Fragment && Fragment 的数据交互,这其中有两个比较重要的方法:Fragment.setTargetFragment、getTargetFragment()。
在 FirstFragment 中,通过setTargetFragment来连接需要交互的Fragment
|
|
接着实现onActivityResult,处理传递过来的数据
|
|
在 SecondFragment 中:调用sendResult()方法,回传数据给 FirstFragment
|
|