Actvity和Fragment的通信及框架的使用_fragment访问act

71 阅读3分钟

Activity中使用Fragment的数据

相信大家已经知道和掌握了在Activity中管理Fragment的方法,我们是通过new来实例化一个Fragment的,如下所示:

CustomFrament custome = new CustomFrament();

之前已经学习过了Android的核心组件开发和Intent,我们知道,Intent往往是组件之间进行通信,数据传递的一个非常好的工具。但是很可惜,我们发现在Activity和Fragment的使用和管理中,好像并没有见到Intent的身影,那随之而来就有一个疑问,如果在一些特殊情况下,Activity和Fragment需要进行通信或者说数据传递,该如何实现呢?

接口回调

相信大家在前面的课程中,已经多次的遇到过接口回调这种方式,在Android应用的原生开发中,接口回调就是最常见的一种使用方式,特别是各种控件的监听器方法,网络请求等均是通过接口回调的方式来完成的。

由此,我们产生了一些想法,可以通过接口的形式将Activity和要通信的Fragment联系起来,具体的做法是:

  • 1、在Fragment中自定义一个接口,并设置接口的set方法
  • 2、在要与Fragment通信的Activity中实例化Fragment实例,实例化后调用set方法设置监听器,并传入一个新的接口实例化对象。
  • 3、Fragment中,在需要传递数据的地方,调用回调函数,并将数据通过回调函数的参数进行传递即可。

以上这种方式是最常见的原生的Activity和Fragment通信的方法,虽然步骤麻烦一些,但是容易理解,很方便,不需要额外的其他配置。

Fragment中使用Activity的数据

上文我们说了Fragment传递数据到Activity中,另外还有一种情况可能是:Activity传递数据到Fragment当中,该如何实现呢?

在实例化Fragment对象后,可以通过调用Fragment的方法为Fragment设置数据,设置Fragment的方法为:

fragment.setArgments(bundle);

具体使用方式,参见案例代码。

二、事件总线机制框架EventBus

EventBus简介

EventBus是由greenrobot 组织贡献的一个Android事件发布/订阅轻量级框架。EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。

EventBus在github上的开源地址如下:github.com/greenrobot/…

该框架EventBus的官网如下:greenrobot.org/eventbus/

可以在github页面查看具体的内容。

EventBus框架依赖

最新的EventBus是3.2.0版本,可以在build.gradle文件中设置依赖,如下所示:

implementation 'org.greenrobot:eventbus:3.2.0'

在Android的项目开发中,需要添加一下保护混淆,需要在Android项目的proguard文件中添加如下代码:

-keepattributes *Annotation*
-keepclassmembers class * {
    @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
 
# And if you use AsyncExecutor:
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
    <init>(java.lang.Throwable);
}

EventBus的使用