利用EventBus实现Activity向Fragment传递数据

根据我个人所了解,Activity与Fragment的通信大概可以分为以下四种:

  • 利用Bundle来传递参数
  • 在Activity定义一个带有返回值的方法,在Fragment中重写onAttach方法,然后将onAttach的activity强制转换为你的Activity
  • 在Fragment增加一个方法,把参数传进去。
  • 利用第三方框架:EventBus

废话不多说,直接上教程

首先假设一个比较常用的场景ViewPager+TabLayout+Fragment,在MainActivity中我们要传消息给Fragment1,Fragment2。

第一步:添加EventBus的依赖包:

implementation 'org.greenrobot:eventbus:3.1.1'

官网的github地址为:https://github.com/greenrobot/EventBus

第二步:分别在Fragment1和Fragment2中

1.在onCreateView方法里面注册EventBus:

EventBus.getDefault().register(this);

2.在onDestroyView方法里面解绑EventBus:

EventBus.getDefault().unregister(this);

3.添加接收消息的方法:

@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
    public void onMessageEvent(Teacher teacher) {
        Log.d("date1", "onMessageEvent: " + this.teacher.toString());
        loadData();
    }

这里有个几个地方需要注意,首先是@Subscribe注解,3.0以后强制要求加的,threadMode正如名字一样选择处理消息的进程,它有三种选择:MAIN,BACKGROUND,ASYNC。由于Avtivity的加载比Fragment要快,sticky = true就是不断地接收消息,如果sticky = false的话,EventBus会提示找不到注册者。另外接收到消息以后不再需要获取数据可以在onMessageEvent的方法里面对EventBus解绑。

最后EventBus提供了一个MessageEvent的消息事件类,你可以在里面定制自己的业务。由于我只有一个Teacher类的数据,所以省略掉了MessageEvent。

public class MessageEvent{
    private String message;
    public  MessageEvent(String message){
        this.message=message;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

第三步:在Activity里面发送相应的消息

EventBus.getDefault().postSticky(selectedTeacher);

结果:

7248113-ba541218d4fd044c.png
image

猜你喜欢

转载自blog.csdn.net/weixin_33807284/article/details/87574832