参考文章

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

  1. public class MainActivity extends ActionBarActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. System.out.println("MainActivity -- onCreate");
  7.  
  8. FragmentManager fm = this.getSupportFragmentManager();
  9.  
  10. // 在Activity中注册 fragment, 也可以在清档文件中注册
  11. fm.beginTransaction()
  12. .replace(R.id.flContent, new LeftFragment(), "left").commit();
  13. }
  14.  
  15. @Override
  16. public boolean onCreateOptionsMenu(Menu menu) {
  17. getMenuInflater().inflate(R.menu.main, menu);
  18. return true;
  19. }
  20.  
  21. @Override
  22. public boolean onOptionsItemSelected(MenuItem item) {
  23. int itemId = item.getItemId();
  24. // 通过发送广播消息给 fragment
  25. Intent intent = new Intent();
  26. if (R.id.left == itemId) {
  27. intent.setAction("left");
  28. LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
  29. }
  30. return true;
  31. }
  32. }

LeftFragment代码如下:

  1. public class LeftFragment extends Fragment {
  2. private TextView message;
  3.  
  4. @Override
  5. public void onCreate(@Nullable Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. // 在fragment中注册一个广播用于接收,Activity中发送过来的消息
  8. IntentFilter filter = new IntentFilter();
  9. filter.addAction("left");
  10. LocalBroadcastManager.getInstance(getContext()).registerReceiver(
  11. new BroadcastReceiver() {
  12. @Override
  13. public void onReceive(Context context, Intent intent) {
  14. // 去做一些业务处理,比如联网操作, 解析操作...
  15. message.setText("LeftFragment,收到了Activity发了的--->left<---广播");
  16. }
  17. }, filter);
  18. }
  19.  
  20. @Override
  21. @Nullable
  22. public View onCreateView(LayoutInflater inflater,
  23. @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  24. View view = View.inflate(getContext(), R.layout.fragment_left, null);
  25. message = (TextView) view.findViewById(R.id.message);
  26. return view;
  27. }
  28. }

点击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

  1. public class MainActivity extends ActionBarActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6.  
  7. this.getSupportFragmentManager().beginTransaction()
  8. .replace(R.id.flContent, new LeftFragment(), "left").commit();
  9. }
  10.  
  11. @Override
  12. public boolean onCreateOptionsMenu(Menu menu) {
  13. getMenuInflater().inflate(R.menu.main, menu);
  14. return true;
  15. }
  16.  
  17. @Override
  18. public boolean onOptionsItemSelected(MenuItem item) {
  19. // 1.Activity随便发送一个消息给fragment
  20. EventBus.getDefault().post("change");
  21. return true;
  22. }
  23. }

Fragment中需要做2个操作:

注册EventBus 和 接收 Activity发送过来的通信消息

  1. public class LeftFragment extends Fragment {
  2. private TextView message;
  3. @Override
  4. public void onCreate(@Nullable Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. // 1. 接收者fragment中注册需EventBus
  7. EventBus.getDefault().register(this);
  8. }
  9.  
  10. @Override
  11. @Nullable
  12. public View onCreateView(LayoutInflater inflater,
  13. @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  14. View view = View.inflate(getContext(), R.layout.fragment_left, null);
  15. message = (TextView) view.findViewById(R.id.message);
  16. return view;
  17. }
  18.  
  19. /**
  20. * 接收activity传递过来的消息 因为activity传递的是一个字符串,所以这里参数是String
  21. * @param txt
  22. */
  23. public void onEvent(String txt) {
  24. if (txt.equals("change")) {
  25. message.setText("fragment和activity通信成功了");
  26. // 可以做一些其他业务,比如获取网络连接,刷新页面...
  27. }
  28. }
  29. }

布局文件和 广播通信的布局完全一样,运行效果图如下:

以上只是EventBus的最简单的通信机制,他还有其他一些重要方法

转载:http://blog.csdn.net/lmj623565791/article/details/40920453

转载:http://blog.csdn.net/harvic880925/article/details/40660137

android中fragment与activity之间通信原理以及例子的更多相关文章

  1. Android(Fragment和Activity之间通信)

    Fragment的使用可以让我们的应用更灵活的适配各种型号的安卓设备,但是对于Fragment和Activity之间的通信,很多朋友应该比较陌生,下面我们就通过一个实例来看一看如何实现. 一.Acti ...

  2. Android中Fragment与Activity之间的交互(两种实现方式)

    (未给Fragment的布局设置BackGound) 之前关于Android中Fragment的概念以及创建方式,我专门写了一篇博文<Android中Fragment的两种创建方式>,就如 ...

  3. Android 笔记-Fragment 与 Activity之间传递数据

    Fragment 与 Activity之间传递数据有两种方法.一种是使用setArgument,一种是使用接口回调.以下先学习第一种方法. (1)使用setArgument方法: 为了便于理解,我在这 ...

  4. Android中BroadCast与Activity之间的通信

    在看本文之前,假设你对于Android的广播机制不是非常了解.建议先行阅读我转载的一篇博文:图解 Android 广播机制. 因为本案例比較简单,故直接在此贴出代码,不做过多的阐述. 先上效果截图: ...

  5. Android中两个Activity之间简单通信

    在Android中,一个界面被称为一个activity,在两个界面之间通信,采用的是使用一个中间传话者(即Intent类)的模式,而不是直接通信. 下面演示如何实现两个activity之间的通信. 信 ...

  6. Android中Service和Activity之间的通信

    启动Service并传递数据进去: Android中通过Intent来启动服务会传递一个Intent过去. 可以在Intent中通过putExtra()携带数据 Intent startIntent ...

  7. Fragment 和 Activity 之间通信

    在 Activity 中获取 Fragment 实例: FragmentManager 提供了一个类似于 findViewById 的方法,专门用于从布局文件中获取 Fragment 实例: //通过 ...

  8. Android中Fragment和ViewPager那点事儿(仿微信APP)

    在之前的博文<Android中使用ViewPager实现屏幕页面切换和引导页效果实现>和<Android中Fragment的两种创建方式>以及<Android中Fragm ...

  9. Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

随机推荐

  1. Winform 自定义文本框

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  2. 网编(小白心得osi七层协议)

    目录 1 C/S B/S架构 2网络通信原理 3osi七层协议 数据链路层 网络层 传输层 应用层 1 C/S B/S架构 ​ C:client端(客户端) ​ B:browse 浏览器 ​ S: s ...

  3. 零拷贝Zero copy-linux and java

    背景-几种拷贝方式 方式1:Copying in Two Sample System Calls read(file, tmp_buf, len); write(socket, tmp_buf, le ...

  4. Zabbix-设置自动发现规则实例

    一.前文 此篇文章,主要针对自动发现规则中使用snmpv2类型发现 zabbix官方解读,可当参考:   https://www.zabbix.com/documentation/4.0/zh/man ...

  5. 第 10 篇:小细节 Markdown 文章自动生成目录,提升阅读体验

    目录 在文中插入目录 在页面的任何地方插入目录 处理空目录 美化标题的锚点 URL 作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 上 ...

  6. python之爬虫-必应壁纸

    python之爬虫-必应壁纸 import re import requests """ @author RansySun @create 2019-07-19-20:2 ...

  7. Windows 10“数字权利激活”永久性激活!!!

    直接运行软件即可自动激活,等出现"激活成功"即可关闭软件. 注意事项: 激活软件不会帮你打开Windows update服务,如关闭系统自动更细服务的需要先启动服务. 可以在小娜搜 ...

  8. HTTP协议请求响应模型

    HTTP协议请求响应模型:以”用户登录“这个场景来描述 第一步:客户端发起请求到API接口层,操作:用户在客户端填写用户名和密码,点击登录,发送请求. 第二步:api接收到客户端发起的用户请求,api ...

  9. NLP(四) 正则表达式

    * + ? * :0个或多个 + :1个或多个 ? :0个或1个 re.search()函数,将str和re匹配,匹配正确返回True import re # 匹配函数,输入:文本,匹配模式(即re) ...

  10. WebApi使用OAuth2认证

    本篇文章实现了四种认证方式中的客户端模式和密码模式,未实现token持久化 未介绍OAuth2的相关概念,全部是干货,可自己在网上搜索OAuth2相关知识,在这不做过多阐述 一.引用OAuth2所需的 ...