Android 使用EventBus进行Fragment和Activity通信
本文介绍EventBus的基本使用,以及用于Fragment和Activity之间通信。
github地址: https://github.com/greenrobot/EventBus 版本是 EventBus-2.4.0 release
EventBus是基于订阅和发布的一种通信机制,使用流程如下:
- 实例化EventBus对象
- 注册订阅者
- 发布消息
- 接受消息
对应代码
EventBus eventBus = new EventBus();
eventBus.register(subscriber object);//注册订阅者
订阅者对象中必须有 onEvent public 方法
public void onEvent(Object event){
//接收消息
}
eventBus.post(event);//发送消息
应用到Activity和Fragment中
因为订阅者必须有onEvent方法,因此我们创建一个基类让onEvent方法作为抽象方法
public abstract class BaseFragment extends Fragment {
public BaseFragment() {
}
public abstract void onEvent(MyEvent eventData);
}
MainActivity
public class MainActivity extends FragmentActivity {
public Button btn;
public EventBus eventBus;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.btn);
eventBus = new EventBus();
FragmentManager fm = getSupportFragmentManager();
MyFragment myFragment = new MyFragment();
fm.beginTransaction().replace(R.id.container, myFragment).commit();
eventBus.register(myFragment);//注册订阅者 MyFragment
btn.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
List<String> list = new ArrayList<String>();
list.add("test string");
MyEvent myEvent = new MyEvent();
myEvent.eventType = ;
myEvent.data = list;
eventBus.post(myEvent);//发布消息
myEvent = new MyEvent();
myEvent.eventType = ;
myEvent.data = new MyCallBack();//接口回调作为引用
eventBus.post(myEvent);//发布消息
}
});
}
//此时MainActivity作为订阅者
public void onEvent(MyEvent event) {
Log.d("", "onEvent >> callback main>>>" + event.data);
}
//回调接口也可以做为事件数据
class MyCallBack implements DataCallBack {
@Override
public void onCallback(MyEvent eventData) {
Log.d("", "eventData >>>> " + eventData);
}
}
}
封装的消息MyEvent
public class MyEvent {
public MyEvent() {
}
public int eventType;//可能类型有很多种,数据也不一样
public Object data;//数据对象
}
MyFragment
public class MyFragment extends BaseFragment {
private DataCallBack actCallback;
private EventBus eventBus;
public MyFragment() {
setHasOptionsMenu(true);
eventBus = new EventBus();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_main, null);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
view.findViewById(R.id.call).setOnClickListener(new OnClickListener() {
public void onClick(View view) {
if (actCallback != null) { //得到接口后 回调一下
MyEvent event = new MyEvent();
event.data = "this is fragment:" + MyFragment.this;
actCallback.onCallback(event);//调用回调
}
}
});
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (getActivity() != null) {
eventBus.register(getActivity());//事件订阅者注册,订阅者为MainActivity
}
}
@Override
public void onEvent(MyEvent event) {
int type = event.eventType;
if (type == ) {
Log.d("", "onEvent type 1:" + event.data);
}
else if (type == ) {
Log.d("", "onEvent type 2:" + (event.data instanceof DataCallBack));
if (event.data instanceof DataCallBack) {
actCallback = ((DataCallBack) event.data);//得到回调
//发消息给MainActivity
MyEvent event2 = new MyEvent();
event2.data = "call main activity method";
eventBus.post(event2);//发布消息
}
}
}
}
一般让Fragment调用Activity的方法有一下几种
- 创建Fragment的时候把MainActivity引用传给Fragment,其实通过getActivity()也能获取到实例
- 创建Fragment的时候传入一个Handler实例,在Fragment中sendMessage也是可以的
- 创建Fragment的时候传入一个实例化接口,作为回调
我觉得用接口的方式更加好,耦合性算是比较低的一种。当Fragment pop后 getActivity()获取的引用为NULL,传入Handler实例是可以的,但有些时候你可能用不上Handler这个东西。
EventBus使用还是比较简单的,降低了代码耦合性,只需要在onEvent中处理数据即可。
Android 使用EventBus进行Fragment和Activity通信的更多相关文章
- 关于Fragment与Fragment、Activity通信的四种方式
一直想总结一下Fragment与Fragment.Activity通信的问题,今天有时间一共总结了三种,权当抛砖引玉,如果大家还有更好的方式来实现Fragment和Fragment.Activity的 ...
- 【Android开发】之Fragment与Acitvity通信
上一篇我们讲到与Fragment有关的常用函数,既然Fragment被称为是“小Activity”,现在我们来讲一下Fragment如何与Acitivity通信.如果上一篇还有不懂得,可以再看一下.传 ...
- Android学习——Fragment与Activity通信(二)
接下来就要到Fragment向Activity传输数据了.主要的思路,就是在Fragment中创建一个回调接口,利用该回调接口实现Fragment向Activity传输数据的功能. 回调函数(接口) ...
- Android学习——Fragment与Activity通信(一)
学会了在Activity中加载Fragment的方法之后,接下来便需要学习Activity和Fragment之间的通信.这一节先学习如何把Activity中的信息传递给Fragment. 基本过程 在 ...
- Fragment 与 Activity 通信
先说说背景知识: (From:http://blog.csdn.net/t12x3456/article/details/8119607) 尽管fragment的实现是独立于activity的,可以被 ...
- Android进阶(十二)Fragment VS Activity
Fragment VS Activity Android是在Android 3.0 (API level 11)开始引入Fragment的. 可以把Fragment想成Activity中的模块,这 ...
- fragment 与activity通信 Bundle 序列化数据 Serializable
1.fragment简单套用(静态调用): 新建一个fragment,其xml文件如下: <LinearLayout xmlns:android="http://schemas.and ...
- Android中Service与多个Activity通信
由于项目需要,我们有时候需要在service中处理耗时操作,然后将结果发送给activity以更新状态.通常情况下,我们只需要在一个service与一个activity之间通信,通常这种情况下,我们使 ...
- Android开发之旅-Fragment和Activity之间onCreateOptionsMenu的联系
Fragment和Activity一样,可以重写onCreateOptionsMenu方法来设定自己的菜单,其实这两个地方使用onCreateOptionsMenu的目的和效果都是完全一样的,但是由于 ...
随机推荐
- Codeforces Round #412 (rated, Div. 2, base on VK Cup 2017 Round 3) E. Prairie Partition 二分+贪心
E. Prairie Partition It can be shown that any positive integer x can be uniquely represented as x = ...
- C # 踩坑记录(20190603)
由于公司战略层需求,需要学习c#,在此仅记录相关问题,以便后期回顾. 学习路线 .NET 框架学习与C # 的关系 Visual Studio 简介及相关帮助网站(msdn) Main 方法及&quo ...
- USACO26 moofest 奶牛集会(归并排序)
听说这题也是bzoj的3378&&poj1990,然而没有权限号交不了..poj懒得登. 题意:有n个奶牛,他们相互发出max(a[i].v,a[j].v)*abs(a[i].p-a[ ...
- YTU 2405: C语言习题 牛顿迭代法求根
2405: C语言习题 牛顿迭代法求根 时间限制: 1 Sec 内存限制: 128 MB 提交: 562 解决: 317 题目描述 用牛顿迭代法求根.方程为ax3+bx2+cx+d=0.系数a,b ...
- Expression Blend实例中文教程(11) - 视觉管理器快速入门Visual State Manager(VSM)
Expression Blend实例中文教程(11) - 视觉管理器快速入门Visual State Manager(V 时间:2010-04-12 16:06来源:SilverlightChina. ...
- 强类型DataSet (2011-12-30 23:16:59)转载▼ 标签: 杂谈 分类: Asp.Net练习笔记 http://blog.sina.com.cn/s/blog_9d90c4140101214w.html
强类型DataSet (2011-12-30 23:16:59) 转载▼ 标签: 杂谈 分类: Asp.Net练习笔记 using System; using System.Collections.G ...
- codeforces 686B B. Little Robber Girl's Zoo(水题)
题目链接: B. Little Robber Girl's Zoo //#include <bits/stdc++.h> #include <vector> #include ...
- Ural2040:Palindromes and Super Abilities(离线&manecher算法)
Dima adds letters s1, …, sn one by one to the end of a word. After each letter, he asks Misha to tel ...
- BZOJ 1305:dance跳舞(二分+最大流)
一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会“单向喜欢”).每个男孩 ...
- cmath函数整理
double a= pow(double x, double y)://返回x的y次方. double a= sqrt(double x)://返回x的平方根. double a=ceil(doubl ...