使用EventBus进行Fragment和Activity通信

原创 2015年05月11日 16:23:44

使用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 = 1;
                myEvent.data = list;
                eventBus.post(myEvent);//发布消息

                myEvent = new MyEvent();
                myEvent.eventType = 2;
                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 == 1) {
            Log.d("", "onEvent type 1:" + event.data);
        }
        else if (type == 2) {
            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中不起作用的解决方法

一、AndroidEventBus。 android平台事件总线框架。介绍:https://github.com/bboyfeiyu/AndroidEventBus/blob/master/READM...
  • wblyuyang
  • wblyuyang
  • 2016年01月15日 09:40
  • 11402

fragment之间用eventbus进行传值调用方法

  • 2016年04月03日 19:58
  • 7.6MB
  • 下载

使用EventBus进行Fragment和Activity通信

使用EventBus进行Fragment和Activity通信 本文介绍EventBus的基本使用,以及用于Fragment和Activity之间通信。 github地址: https://git...
  • birdsaction
  • birdsaction
  • 2015年05月11日 16:23
  • 13849

Eventbus 详解,Activity和fragment通讯,相互发送接收数据

EventBus,解决做fragment与activity的交互 。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递...
  • u013790519
  • u013790519
  • 2015年10月16日 18:08
  • 6971

Android EventBus 简化应用程序组件(Activity、Fragment、线程)间通信的开源项目

项目地址:https://github.com/greenrobot/EventBus/ 项目使用的技术呢,说白了,就是将要传递的event(一个Object对象,可任意自定义),发送到公共的组件...
  • jjwwmlp456
  • jjwwmlp456
  • 2014年11月27日 19:36
  • 10188

使用EventBus进行Fragment和Activity通信

使用EventBus进行Fragment和Activity通信 本文介绍EventBus的基本使用,以及用于Fragment和Activity之间通信。  github地址: https://git...
  • xu_mengmeng
  • xu_mengmeng
  • 2016年01月21日 10:26
  • 4930

Android EventBus实战 没听过你就out了

转载请表明出处:http://blog.csdn.net/lmj623565791/article/details/40794879,本文出自:【张鸿洋的博客】1、概述最近大家面试说经常被问到Even...
  • lmj623565791
  • lmj623565791
  • 2014年11月05日 17:21
  • 93349

EventBus实现activity跟fragment交互数据

最近老是听到技术群里面有人提出需求,activity跟fragment交互数据,或者从一个activity跳转到另外一个activity的fragment,所以我给大家介绍一个开源项目,EventBu...
  • lowprofile_coding
  • lowprofile_coding
  • 2015年09月22日 03:13
  • 5382

EventBus传值(Fragment和Activity,Activity和Activity)

第一步:在build.gradle中添加依赖 dependencies { compile 'org.greenrobot:eventbus:3.0.0' } 第二部创建一个javaBea...
  • feifei20170707
  • feifei20170707
  • 2017年09月13日 09:45
  • 272

EventBus进入Activity页面给Fragment传值,并弹出提示

1. 进入页面先访问网络状态.返回true或false表示网络状态的有无,将这个值使用EventBus传给Fragment页面 首先需要导入依赖 [html] view plain c...
  • IT666DHW
  • IT666DHW
  • 2017年12月03日 20:33
  • 212
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用EventBus进行Fragment和Activity通信
举报原因:
原因补充:

(最多只允许输入30个字)