参考文章

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之间通信原理以及例子的更多相关文章

  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. [趣学程序]java的常用类之String

    java基础之常用类 String类 String表示字符串,所谓字符串,就是一连串的字符,是java中最常用的类之一. String是不可变类,一旦String对象被创建,包含在对象中的字符序列(内 ...

  2. 『开发技术』GPU训练加速原理(附KerasGPU训练技巧)

    0.深入理解GPU训练加速原理 我们都知道用GPU可以加速神经神经网络训练(相较于CPU),具体的速度对比可以参看我之前写的速度对比博文: [深度应用]·主流深度学习硬件速度对比(CPU,GPU,TP ...

  3. 逛公园[NOIP2017 D2 T3](dp+spfa)

    题目描述 策策同学特别喜欢逛公园. 公园可以看成一张 \(N\)个点\(M\) 条边构成的有向图,且没有自环和重边.其中 1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值,代表策策经过这条 ...

  4. mysql 输入show databases 没反应

    我是小白,大佬勿喷 *** mysql 输入show databases 没反应 一句话 不要忘记使用MySQL时在命令后加;哦 * * * 在Linux输入以下命令 mysql 终端显示以下文本 W ...

  5. 第一次Git使用以及码云(Gitee)

    下载安装Git,官网下载地址https://git-scm.com/downloads,我用的是Win10版,下载好后一路默认安装,安装时会给你自动添加环境变量,完成后打开cmd,输入git --ve ...

  6. PostgreSQL入门教程(命令行)

    初次安装完成后 1.默认生成一个名为postgres的数据库 2.一个名为postgres的数据库用户 3.这里需要注意的是,同时还生成了一个名为postgres的Linux系统用户. 下面,我们使用 ...

  7. 终于,我感受到了IDEA的强大

    Java开发者千千万,开发者用的开发工具目前主流却只有2种:eclipse和IDEA,我入行以来一直用的eclipse,听过IDEA很好很强大,但是也只是处于听说的阶段,基本没用过,自然没怎么体会过. ...

  8. 快速了解Python并发编程的工程实现(下)

    关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...

  9. (转)2019年给Java编程初学者的建议(附学习大纲)

    本文链接:https://blog.csdn.net/javajlb/article/details/85920904 1. 引言这是一篇初学者干货,请耐心看完,希望对你有帮助 作为初学者的你,命中了 ...

  10. block 和 weak

    block下循环引用的问题 __block本身并不能避免循环引用,避免循环引用需要在block内部把__block修饰的obj置为nil __weak可以避免循环引用,但是其会导致外部对象释放了之后, ...