美文网首页
利用EventBus实现Activity向Fragment传递数

利用EventBus实现Activity向Fragment传递数

作者: DarknessYami | 来源:发表于2019-02-03 22:21 被阅读56次

    根据我个人所了解,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

    相关文章

      网友评论

          本文标题:利用EventBus实现Activity向Fragment传递数

          本文链接:https://www.haomeiwen.com/subject/zyuusqtx.html