根据我个人所了解,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);
结果:
image
网友评论