EventBus 3.0实现Activity和fragment通信、fragment和fragment通信

注意:说两个坑
1.activity和Fragment通过eventbus通信,两个类必须都regist和unregist,unregist最好放到onpause方法中,要不容易出异常。
2.两个类中必须有最少一个接受方法,如果一个也没有也容易出异常。

  • 首先在gradle(app)中添加依赖
  compile 'org.greenrobot:eventbus:3.0.0'
  • 实例说明:
    MainActivity中有两个fragment
    1.点击fragment1中的按钮后,跳转到fragment2,这个过程由fragment1给MainActivity发消息处理,完成fragment和Activity之间的通信
    2.点击fragment2中的按钮,跳转回fragment1,并将fragment2中的信息告诉fragment1。这个过程包括fragment2给MainActivity发消息做跳转,fragment2给fragment1发消息实体。完成fragment和Activity之间、fragment2和fragment1之间的通信。

看下效果
这里写图片描述
1.MainACtivity

MainActivity中注册和取消注册代码


    @Override
    protected void onResume() {
        super.onResume();
        EventBus.getDefault().register(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

MainActivity中接收fragment发送的消息

  @Subscribe(threadMode = ThreadMode.MAIN)
    public void FragmentButtonClicked(String str) {
        switch (str) {
            case "fragment1":
                Toast.makeText(getApplicationContext(), "fragment1点击", Toast.LENGTH_LONG).show();
                initFragmentSelected(1);//展示fragment2界面
                break;
            case "fragment2":
                Toast.makeText(getApplicationContext(), "fragment2点击", Toast.LENGTH_LONG).show();
                initFragmentSelected(0);//展示fragment1界面
                break;

            default:
                break;
        }

2.fragment1

fragment1中注册和取消注册的代码,旨在接收fragment2发送的消息

  @Override
    public void onResume() {
        super.onResume();
        EventBus.getDefault().register(this);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

点击fragment1中的按钮点击,告诉MainActivity展示fragment2界面

  @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.tv1:
                EventBus.getDefault().post("fragment1");//告诉MainActivity,fragment1中的按钮点击了
                break;
        }
    }

fragment1中处理fragment2发送消息的代码

  @Subscribe(threadMode = ThreadMode.MAIN)
    public void Fragment2ButtonClicked(MsgToSend msgToSend) {
        mTv1.setText("我是fragment111111111  后面的信息是fragment2返回的数据:"+msgToSend.getMessage());
    }

3.fragment2

fragment2中的按钮点击后,发送了两个消息,一个是告诉MainActivity切换fragment1界面的消息,一个是将实体MsgToSend告诉fragment1的消息

 @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.tv2:
                EventBus.getDefault().post("fragment2");
                EventBus.getDefault().post(new MsgToSend("我是fragment2,我给你发个信息"));
                break;
        }
    }

这就是通过eventBus实现Activity和fragment通信、fragment和fragment通信的小例子,特别的简单,给eventBus点个赞

demo地址:https://github.com/DevelopWb/EventBusTest.git

猜你喜欢

转载自blog.csdn.net/csdn_mm/article/details/78862659