android t跳转到fragment,Android 使用EventBus进行Fragment和Activity通信

本文介绍EventBus的基本使用,以及用于Fragment和Activity之间通信。

github地址: https://github.com/greenrobot/EventBus 版本是 EventBus-2.4.0 release

EventBus是基于订阅和发布的一种通信机制,使用流程如下:

实例化EventBus对象

注册订阅者

发布消息

接受消息

对应代码

EventBus eventBus = newEventBus();

eventBus.register(subscriberobject);//注册订阅者

订阅者对象中必须有 onEvent public方法public void onEvent(Object event){//接收消息

}

eventBus.post(event);//发送消息

应用到Activity和Fragment中

因为订阅者必须有onEvent方法,因此我们创建一个基类让onEvent方法作为抽象方法

public abstract classBaseFragment extends Fragment {publicBaseFragment() {

}public abstract voidonEvent(MyEvent eventData);

}

MainActivity

public classMainActivity extends FragmentActivity {publicButton btn;publicEventBus eventBus;

@Overrideprotected voidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

btn=(Button) findViewById(R.id.btn);

eventBus= newEventBus();

FragmentManager fm=getSupportFragmentManager();

MyFragment myFragment= newMyFragment();

fm.beginTransaction().replace(R.id.container, myFragment).commit();

eventBus.register(myFragment);//注册订阅者 MyFragment

btn.setOnClickListener(newOnClickListener() {public voidonClick(View arg0) {

List list = new ArrayList();

list.add("test string");

MyEvent myEvent= newMyEvent();

myEvent.eventType= 1;

myEvent.data=list;

eventBus.post(myEvent);//发布消息

myEvent= newMyEvent();

myEvent.eventType= 2;

myEvent.data= new MyCallBack();//接口回调作为引用

eventBus.post(myEvent);//发布消息

}

});

}//此时MainActivity作为订阅者

public void onEvent(MyEvent event) {

Log.d("", "onEvent >> callback main>>>" + event.data);

}//回调接口也可以做为事件数据

classMyCallBack implements DataCallBack {

@Overridepublic voidonCallback(MyEvent eventData) {

Log.d("", "eventData >>>>" +eventData);

}

}

}

封装的消息MyEvent

public classMyEvent {publicMyEvent() {

}public int eventType;//可能类型有很多种,数据也不一样

public Object data;//数据对象

}

MyFragment

public classMyFragment extends BaseFragment {privateDataCallBack actCallback;privateEventBus eventBus;publicMyFragment() {

setHasOptionsMenu(true);

eventBus= newEventBus();

}

@OverridepublicView onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_main, null);

}

@Overridepublic voidonViewCreated(View view, Bundle savedInstanceState) {

view.findViewById(R.id.call).setOnClickListener(newOnClickListener() {public voidonClick(View view) {if (actCallback != null) { //得到接口后 回调一下

MyEvent event = newMyEvent();event.data = "this is fragment:" + MyFragment.this;

actCallback.onCallback(event);//调用回调

}

}

});

}

@Overridepublic voidonActivityCreated(Bundle savedInstanceState) {

super.onActivityCreated(savedInstanceState);if (getActivity() != null) {

eventBus.register(getActivity());//事件订阅者注册,订阅者为MainActivity

}

}

@Overridepublic 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 = newMyEvent();

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中处理数据即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306070.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

达梦数据查询编码_查询数据库的编码方式

在Mysql中(1)查看Mysql数据库编码show variables like character_set_database 或者 show create database 数据库名称(2)查看Mysql中某张表的编码show create table 表名show create database 数据库名称、show create table 表名 ,还能够显示建库和建表语句。(3)…

玩转git-flow工作流-分支解析

概述搞开发的相信大部分人git天天都在用,那么一般我们在实际工程当中,遵循一个合理、清晰的Git使用流程,是非常重要的。否则,每个人都提交一堆杂乱无章的commit,项目很快就会变得难以协调和维护。那么是如何来规范整个…

android中的帧动画,[Android开发] Android中的帧动画

MainActivity文件:public class MainActivity extends Activity implements OnClickListener{AnimationDrawable anim_draw;SuppressLint("NewApi")Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);set…

ksu7对讲机调频软件_数字对讲机的群呼功能原理是什么?你了解多少?

大家都明白数字对讲机能够达到组呼、群呼、选呼的用途,但对数字对讲机的群呼功能原理可能操作方并不是太熟悉,下面我们就和大家来谈谈有关数字对讲机的群呼功能原理:无线对讲机群呼是为了更好地达到1个数字对讲机能够同一时间跟多个数字对讲机…

引入Jaeger——使用

上一篇定义了两种使用Jaeger的方式:中间件和action过滤器,下面这个例子定义了两个服务 WebAPI01,请求WebAPI02,采用的是中间件的请求方式。引入JaegerSharp包(或发布到自己的Nuget库里引用)WebAPI01的Start…

android studio初始化设置,Android studio 初始设置

1.compiler 勾选 Make project automatically(only works while not running/debugging) 自动编译2.设置File Encodings 中的编码 IED ENcoding,Project Encoding,Default encoding for properties files 改为UTF-83.Gradle 中 勾选 offline work 加快编译速度4.设置Tasks 中的…

抖音ai智能机器人挂机_电销秘诀 电销企业难以拒绝的AI智能电销机器人

眼下是快节奏的时代,超智能化的电销机器人已然成为了电销企业实现高速发展的首选方式。为何现代电销企业都会摒弃纯人工电销方式,采取机器人与人工协作方式呢?这就不得不说是因为AI外呼机器人的卓越性能和优势。一,提升工作效率AI…

如何在 ASP.NET Core 中使用 ActionFilter

ASP.NET Core MVC 中的 Filters 允许我们在 请求处理管道 中的某一个阶段的之前和之后执行自定义代码,不同类型的 filter 对应着 请求处理管道 的不同阶段,比如说:ActionFilter 可以在 Action 方法的之前或者之后执行自定义代码,这…

dataset的去重计数 g2_ExcelExcel去重、计数一步到位,这个方法简单到哭

私信回复关键词【插件】,获取Excel高手都在用的“插件合集插件使用小技巧”!最近在哼哧哼哧搬家,搬家第一天,面对空荡荡的房子,我发现了一个严峻的问题——日用品还没买。我打开了一个月前写下的日用品清单&#xff1a…

【源码解读】Vue与ASP.NET Core WebAPI的集成

在前面博文【Vue】Vue 与 ASP.NET Core WebAPI 的集成中,介绍了集成原理:在中间件管道中注册SPA终端中间件,整个注册过程中,终端中间件会调用node,执行npm start命令启动vue开发服务器,向中间件管道添加路由…

android开发环境 比较好,android 开发环境比较(Android开发环境比较).doc

android 开发环境比较(Android开发环境比较)android 开发环境比较(Android开发环境比较)Android build up various development environmentsThis article describes some of the things you need to know about the Android development environment configuration. The Andro…

ios采用什么技术_app软件公司开发宠物别APP采用什么技术?

app软件公司开发宠物别APP采用什么技术?随着经济的发展,人们生活水平的提高,养宠的家庭越来越多,宠物也逐渐成为主人家庭成员的重要组成部分,宠物识别APP在市场上也是很热门的手机软件,那么它是根据什么原理…

Dapr微服务应用开发系列3:服务调用构件块

题记:这篇开始逐一深入介绍各个构件块,从服务调用开始原理所谓服务调用,就是通过这个构件块让你方便的通过HTTP或者gRPC协议同步调用其他服务的方法,这些方法也是通过HTTP或者gRPC来暴露的。而方便的含义在于,你无需担…

Android开发p图软件,媲美大神P图效果 Android软件抠图神手

媲美大神P图效果 Android软件抠图神手2013年02月20日 01:50作者:杨霏霏编辑:杨霏霏文章出处:泡泡网原创分享泡泡网手机频道2月20日 PS的功能大家耳熟能详,其中抠图便是各位PS用户普遍会用到的一个功能。然而手机上抠图大家想过吗&…

腾讯公测云开发低码!实战评测

听说腾讯的新产品『 云开发低码 』即将开放公测了,怀着无比激动的心情,鱼皮立刻去官网申请并成功拿到了公测资格,然后使用它开发了一个小程序,并且通过 2020 Techo Park 开发者大会加深了对这项技术的了解。而就在 2020 年的最后一…

gitee 从 拉取新分支到本地_Hexo博客详细教程(一)| 建立本地站点

点上方蓝字关注我们每天都有好玩的东西等着你博客炫酷效果展示安装Hexo安装Git参考文章:Git实用教程(二) | Git简介及安装详解。安装NodejsNodejs可以从官网( https://nodejs.org/en )下载LTS版本:安装之后检查一下是否正常输出版本信息:安装…

索尼android 怎么截屏快捷键,索尼XZ Premium怎么截屏 2种索尼XZ Premium截图方法

截屏作为手机常用功能之一,我们经常在分享朋友圈或微博的时候经常需要用到屏幕截屏。今天本文主要分享一下索尼XZ Premium怎么截屏,作为一款相对冷门的非国产骁龙835旗舰机,在使用中难免出现一些不太熟悉的问题,下面小编分享2种索…

IdentityServer4 之Client Credentials走起来

前言API裸奔是绝对不允许滴,之前专门针对这块分享了jwt的解决方案(WebApi接口裸奔有风险);那如果是微服务,又怎么解决呢?每一个服务都加认证授权也可以解决问题,只是显得认证授权这块冗余,重复在搞事情&…

读数据库遇到空就进行不下去_如何保证缓存与数据库的双写一致性?

作者:你是我的海啸来源:https://blog.csdn.net/chang384915878分布式缓存是现在很多分布式应用中必不可少的组件,但是用到了分布式缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据…

获取html滚动条位置,pc和移动端获取滚动条的位置

html5碰撞小球模拟这里根据动量守恒和能量守恒定理来计算小球的位置,从而模拟完全弹性碰撞下的小球运行轨迹. html代码: /p>spring jdbctemplate源码跟踪闲着没事,看看源码也是一种乐趣! java操作数据库的基本步骤都是类似的: 1. 建立数据库连接 2. 创建Connection 3. 创建s…