android中fragment与activity之间通信原理以及例子
参考文章
http://blog.csdn.net/guozh/article/details/25327685#comments
Activity和fragment通信方式一般有3种方法
1.在fragment中定义接口, Activity去实现接口--->查看上面的参考文章
2.使用广播机制
3.使用EventBus
这3种方式 推荐使用EventBus
下面介绍第2种方式广播通信机制:
首先MainActivity中引入一个fragment, activity的布局很简单,里面只有一个 framelayout.
LeftFragment布局中只有一个TextView, 它去替换MainActivity中的framelayout
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println("MainActivity -- onCreate");
FragmentManager fm = this.getSupportFragmentManager();
// 在Activity中注册 fragment, 也可以在清档文件中注册
fm.beginTransaction()
.replace(R.id.flContent, new LeftFragment(), "left").commit();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int itemId = item.getItemId();
// 通过发送广播消息给 fragment
Intent intent = new Intent();
if (R.id.left == itemId) {
intent.setAction("left");
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
return true;
}
}
LeftFragment代码如下:
public class LeftFragment extends Fragment {
private TextView message;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 在fragment中注册一个广播用于接收,Activity中发送过来的消息
IntentFilter filter = new IntentFilter();
filter.addAction("left");
LocalBroadcastManager.getInstance(getContext()).registerReceiver(
new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// 去做一些业务处理,比如联网操作, 解析操作...
message.setText("LeftFragment,收到了Activity发了的--->left<---广播");
}
}, filter);
}
@Override
@Nullable
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = View.inflate(getContext(), R.layout.fragment_left, null);
message = (TextView) view.findViewById(R.id.message);
return view;
}
}
点击ActionBar的 left_item 按钮--->运行效果图:

点击left_Item后,就会切换到 fragment去显示内容.
然后就是第三种通信方式: EventBus
一、概述
EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。
1.下载EventBus的类库
源码:https://github.com/greenrobot/EventBus
2.EventBus使用步骤:
1>Define events: 任意定义一个事件 public class MessageEvent { /* Additional fields if needed */ }
2>Prepare subscribers: 注册我们的订阅者 eventBus.register(this); public void onEvent(AnyEventType event) {/* Do something */};
3>Post events: 发布者 eventBus.post(event);
如果使用Gradle需要导入包:compile 'de.greenrobot:eventbus:2.4.0'
3.简单例子
在MainActivity中使用EventBus的post方法 随便发送一个消息给Fragment
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.getSupportFragmentManager().beginTransaction()
.replace(R.id.flContent, new LeftFragment(), "left").commit();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// 1.Activity随便发送一个消息给fragment
EventBus.getDefault().post("change");
return true;
}
}
Fragment中需要做2个操作:
注册EventBus 和 接收 Activity发送过来的通信消息
public class LeftFragment extends Fragment {
private TextView message;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 1. 接收者fragment中注册需EventBus
EventBus.getDefault().register(this);
}
@Override
@Nullable
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = View.inflate(getContext(), R.layout.fragment_left, null);
message = (TextView) view.findViewById(R.id.message);
return view;
}
/**
* 接收activity传递过来的消息 因为activity传递的是一个字符串,所以这里参数是String
* @param txt
*/
public void onEvent(String txt) {
if (txt.equals("change")) {
message.setText("fragment和activity通信成功了");
// 可以做一些其他业务,比如获取网络连接,刷新页面...
}
}
}
布局文件和 广播通信的布局完全一样,运行效果图如下:

以上只是EventBus的最简单的通信机制,他还有其他一些重要方法
转载:http://blog.csdn.net/lmj623565791/article/details/40920453
转载:http://blog.csdn.net/harvic880925/article/details/40660137
android中fragment与activity之间通信原理以及例子的更多相关文章
- Android(Fragment和Activity之间通信)
Fragment的使用可以让我们的应用更灵活的适配各种型号的安卓设备,但是对于Fragment和Activity之间的通信,很多朋友应该比较陌生,下面我们就通过一个实例来看一看如何实现. 一.Acti ...
- Android中Fragment与Activity之间的交互(两种实现方式)
(未给Fragment的布局设置BackGound) 之前关于Android中Fragment的概念以及创建方式,我专门写了一篇博文<Android中Fragment的两种创建方式>,就如 ...
- Android 笔记-Fragment 与 Activity之间传递数据
Fragment 与 Activity之间传递数据有两种方法.一种是使用setArgument,一种是使用接口回调.以下先学习第一种方法. (1)使用setArgument方法: 为了便于理解,我在这 ...
- Android中BroadCast与Activity之间的通信
在看本文之前,假设你对于Android的广播机制不是非常了解.建议先行阅读我转载的一篇博文:图解 Android 广播机制. 因为本案例比較简单,故直接在此贴出代码,不做过多的阐述. 先上效果截图: ...
- Android中两个Activity之间简单通信
在Android中,一个界面被称为一个activity,在两个界面之间通信,采用的是使用一个中间传话者(即Intent类)的模式,而不是直接通信. 下面演示如何实现两个activity之间的通信. 信 ...
- Android中Service和Activity之间的通信
启动Service并传递数据进去: Android中通过Intent来启动服务会传递一个Intent过去. 可以在Intent中通过putExtra()携带数据 Intent startIntent ...
- Fragment 和 Activity 之间通信
在 Activity 中获取 Fragment 实例: FragmentManager 提供了一个类似于 findViewById 的方法,专门用于从布局文件中获取 Fragment 实例: //通过 ...
- Android中Fragment和ViewPager那点事儿(仿微信APP)
在之前的博文<Android中使用ViewPager实现屏幕页面切换和引导页效果实现>和<Android中Fragment的两种创建方式>以及<Android中Fragm ...
- Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
随机推荐
- JSP前端数据本地排序
在前端中我们经常需要数据的排序,首先写引入我写好的js $(function($) { $('#sclazzId').val($('#voId').val()); document.getElemen ...
- cs231n---CNN架构
1 LeNet-5 (1998) 第一个被提出的卷积网络架构,深度较浅,用于手写数字识别. 2 AlexNet (2012) 架构为: CONV1 ->MAX POOL1 ->NORM1 ...
- ZooKeeper系列(二)—— Zookeeper 单机环境和集群环境搭建
一.单机环境搭建 1.1 下载 下载对应版本 Zookeeper,这里我下载的版本 3.4.14.官方下载地址:https://archive.apache.org/dist/zookeeper/ # ...
- 维恩贝特面试JAVA后台开发
1 自我介绍 2 链表和数组区别(数组空间连续,且有下标,查找快,但是增删数据效率不高,链表的空间不连续,查找起来慢,但是对数据的增删效率高,链表可以随意扩大,数组不能) 3 sort方法的实现 (A ...
- redpwnctf-web-blueprint-javascript 原型链污染学习总结
前几天看了redpwn的一道web题,node.js的web,涉及知识点是javascript 原型链污染,以前没咋接触过js,并且这个洞貌似也比较新,因此记录一下学习过程 1.本机node.js环境 ...
- Hive 系列(五)—— Hive 分区表和分桶表
一.分区表 1.1 概念 Hive 中的表对应为 HDFS 上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为 HDFS 上表目录的子目录,数据按照分区存储在子 ...
- Kafka监控工具汇总
对于大数据集群来说,监控功能是非常必要的,通过日志判断故障低效,我们需要完整的指标来帮我们管理Kafka集群.本文讨论Kafka的监控以及一些常用的第三方监控工具. 一.Kafka Monitorin ...
- linux环境部署,docker如何安装redis
安装步骤 1. 安装Redis 通过docker search redis和docker pull redis下载redis镜像 2. 新建挂载配置文件夹 新建data和conf两个文件夹,位置随意. ...
- 单元测试之NUnit二
NUnit 分三篇文章介绍,入门者可阅读文章,有基础者直接参考官方文档.初次写博客,望大家指点. 导航: 单元测试之NUnit一 单元测试之NUnit二 单元测试之NUnit三 本文介绍常用的NUni ...
- 【CocosBuilder】学习笔记目录
从2019年8月底开始学习CocosBuilder. CocosBuilder 学习笔记(1) CCBReader 解析.ccbi文件流程 CocosBuilder 学习笔记(2) .ccbi 文 ...