Actvity和Fragment的通信及框架的使用

一、Activity和Fragment如何通信

前文我们介绍了Fragment,学习了Fragment在Android开发应用中的使用,接下来我们来聊聊数据传递的问题。

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上的开源地址如下:https://github.com/greenrobot/EventBus

该框架EventBus的官网如下:http://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的使用

在需要使用事件总线框架的地方,需要先初始化,代码如下所示:

 @Override
 public void onStart() {
     super.onStart();
     EventBus.getDefault().register(this);
 }
​
 @Override
 public void onStop() {
     super.onStop();
     EventBus.getDefault().unregister(this);
 }

使用EventBus的方法如下:

  • 首先进行事件定义:
    public static class MessageEvent { /* Additional fields if needed */ }
  • 定义订阅事件的方法,并使用注解进行声明
    @Subscribe(threadMode = ThreadMode.MAIN) 
    public void onMessageEvent(MessageEvent event) {/* Do something */};
  • 发送消息时调用如下方法:
    EventBus.getDefault().post(new MessageEvent());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值