利用接口回调实现fragment与activity的通信

Fragment 与activity相互传递数据,可按如下方式进行:

1、Activity 向Fragment传递数据:在Activity中创建Bundle数据包(如果传输涉及对象,要实现对象的系列化),并调用Fragment的setArguments(Bundle      bundle)方法即可实现将Bundle数据包传给Fragment,这个很容易实现。

2、但是如果反过来呢,单我们点击触发Fragment的事件时,希望将数据返回Activity,Activity获得数据进行之后的操作,也就是Fragment主动向Activity传递数据,这也是本博文将要详细讲解的,利用接口回调实现fragment与activity的通信。

现在假设一个场景:假如Fragment1中是显示一些新闻的窗口,现在我们需要在点击新闻窗口的时候(这个新闻窗口是一个Android组件,下面代码假设它是一个Button,并将它与对应的URL绑定),把对应的uir返回Activity,Activity获取用户点击的新闻窗口信息URL,然后调用具体新闻的Fragment2进行显示具体新闻(把URL传给Fragment2,让Fragment2加载具体的新闻)。

Fragment1 的核心实现:

[java] view
plain
copy

  1. class Fragment1 extends Fragment {
  2. - - - - - - -
  3. Button button ;
  4. //将button绑定网站url
  5. button.setText("www.baidu.com");
  6. - - - - - - -
  7. - - - - - - -
  8. OnMyclikListener myListener;
  9. //定义回调接口
  10. interface OnMyclikListener {
  11. public void onclik(View v) ;
  12. }
  13. //定义供Activity调用的函数
  14. public void setOnclikListener(OnMyclikListener onMyclikListener) {
  15. this.myListener = onMyclikListener;
  16. }
  17. button.setOnClickListener(new OnClickListener() {
  18. @Override
  19. public void onClick(View v) {
  20. // TODO Auto-generated method stub

[java] view
plain
copy

  1. //在这里将被点击的新闻窗口(v)传递给Activity

[java] view
plain
copy

  1. System.out.println("还有我");
  2. }
  3. });
  4. - - - - - - -
  5. - - - - - - -
  6. - - - - - - -
  7. }

[java] view
plain
copy

  1. Activity的核心实现

[java] view
plain
copy

  1. class MyActivity extends Activity {
  2. - - - - - - -
  3. //定义Fragment1,然后将Fragment添加到Activity,这里省略
  4. Fragment1 fragment;
  5. - - - - - - -
  6. - - - - - - -
  7. //在Activity里面调用Fragment的public函数,这个函数我们上面有定义
  8. fragment.setOnclikListener(new OnMyclikListener) {
  9. @Override
  10. public void onClick(View v) {
  11. // TODO Auto-generated method stub
  12. //注意,这个参数v,其实是Fragment1里button的句柄,我们可以通过它来访问button绑定的url
  13. Button button = (Button) v;
  14. String url = button.getText().toString();
  15. }
  16. }
  17. - - - - - - -
  18. - - - - - - -
  19. - - - - - - -
  20. - - - - - - -
  21. }



[java] view
plain
copy

  1. 梳理下执行顺序

[java] view
plain
copy

  1. 1、首先,当我们点击Fragment1里面的button的时候,执行Fragment1里面的一面这部分函数

[java] view
plain
copy

  1. button.setOnClickListener(new OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. // TODO Auto-generated method stub
  5. //在这里将被点击的新闻窗口(v)传递给Activity
  6. myListener.onclik(v);

[java] view
plain
copy

  1. System.out.println("还有我");

[java] view
plain
copy

  1. }
  2. );

也就是执行

public void onClick(View v)

函数,但是当执行到

[java] view
plain
copy

  1. //在这里将被点击的新闻窗口(v)传递给Activity
  2. myListener.onclik(v);

[java] view
plain
copy

  1. 这句的时候,调用了定义接口的接口函数,并将v当做参数,这个v就是被点击的button的句柄

[java] view
plain
copy

  1. 我们看看,这个接口函数的实现,是在Activity里面实现的,然后执行转到Activity

[java] view
plain
copy

  1. 2、上面说到执行转到Activity,也就是Activity的这部分函数

[java] view
plain
copy

  1. //在Activity里面调用Fragment的public函数,这个函数我们上面有定义
  2. fragment.setOnclikListener(new OnMyclikListener) {
  3. @Override
  4. public void onClick(View v) {
  5. // TODO Auto-generated method stub
  6. //注意,这个参数v,其实是Fragment1里button的句柄,我们可以通过它来访问button绑定的url
  7. Button button = (Button) v;
  8. String url = button.getText().toString();
  9. }
  10. }

[java] view
plain
copy

  1. 执行到这里,Activity就获得了Fragment1传递过来的Url了,实现了Fragment1主动向Activity传递数据

[java] view
plain
copy

  1. 当这段函数执行完,然后又回到1</span>

[java] view
plain
copy

  1. button.setOnClickListener(new OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. // TODO Auto-generated method stub
  5. //在这里将被点击的新闻窗口(v)传递给Activity
  6. myListener.onclik(v);

[java] view
plain
copy

  1. System.out.println("还有我");

[java] view
plain
copy

  1. }
  2. );

3、回到1中,继续执行

亦即如下图所示


[java] view
plain
copy

[java] view
plain
copy

  1. 总之

[java] view
plain
copy

  1. 1、用户Fragment1里面的button点击事件,就实现了Fragment1主动将数据Url传递给Activity,Activity获得url后,就可以进行以后的操作了

[java] view
plain
copy

  1. 2、其实读者有没有感觉到接口回调的方式很像组件监听器的方式呢,是的,Android的组件监听接口也是回调接口,也是这么实现的
时间: 2024-11-05 19:34:27

利用接口回调实现fragment与activity的通信的相关文章

Android实战简易教程-第五十二枪(Fragment和Activity之间通信)

Fragment的使用可以让我们的应用更灵活的适配各种型号的安卓设备,但是对于Fragment和Activity之间的通信,很多朋友应该比较陌生,下面我们就通过一个实例来看一看如何实现. 一.Activity->Fragment传递数据 1.main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.an

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的布局很简单,里面只有一个 f

Fragment 和 Activity 之间通信

在 Activity 中获取 Fragment 实例: FragmentManager 提供了一个类似于 findViewById 的方法,专门用于从布局文件中获取 Fragment 实例: //通过挂载点的容器id获取对应的 Fragment 实例RightFragment rightFragment = (RightFragment) getSupportFragmentManager().findFragmentById(R.id.right_fragment); 在 Fragment 中

fragment与activity之间的利用接口通信

在用到fragment的时候,老是会遇到一个问题,就是fragment与activity之间的通信.下面就来记录一下activity和fragment之间 通过实现接口来互相通信的方法. 1. activity 向fragment发出通信,就这么写: private OnMainListener mainListener; // 绑定接口 @Override public void onAttachFragment(Fragmentfragment) { try { mainListener =

Fragment与Activity交互(使用接口)

在Fragment中: 1. // 定义一个回调接口,该Fragment所在Activity需要实现该接口// 该Fragment将通过该接口与它所在的Activity交互 { public void onItemSelected(Integer id);} 2. // 当该Fragment被添加.显示到Activity时,回调该方法 public void onAttach(Activity activity){ super.onAttach(activity); // 如果Activity没

Android学习——Fragment与Activity通信(二)

接下来就要到Fragment向Activity传输数据了.主要的思路,就是在Fragment中创建一个回调接口,利用该回调接口实现Fragment向Activity传输数据的功能. 回调函数(接口) 在学习利用回调接口实现Fragment向Activity传输数据之前,首先要对回调函数有所了解,下面引用知乎用户futeng的回答,侵删:https://www.zhihu.com/question/19801131/answer/26586203. 简单来说,回调函数就是当在一个类A中去调用类B的

Android实战之 万能的接口回调

转载请标明原地址:http://blog.csdn.net/gaolei1201/article/details/47084111 前言:本人也算是自学"成才",呵呵,大学时尽管学的计算机,可是对软件开发却并不感兴趣. 毕业后看同学们或培训Android或培训IOS 4个月后都非常快找到了不错的工作.令我感到非常诧异,也非常羡慕!于是我做出了人生中重要的一个决定.開始学习Android.因为本人比較穷,所以选择自学. 学习的过程实为不易,从刚開始的一无所知时的苦苦挣扎,到学有所得后的应

Android实战之接口回调

由于自己以前也困于抽象.接口等"吓人"的东西,网上又缺乏在项目中实战运用的讲解,下面我就斗胆把自己的理解和大家交流一下下. 本人也算是自学"成才",呵呵,大学时虽然学的计算机,但是对软件开发却并不感兴趣.毕业后看同学们或培训Android或培训IOS 4个月后都很快找到了不错的工作,令我感到很诧异,也很羡煞!于是我做出了人生中重要的一个决定,开始学习Android,由于本人比较穷,所以选择自学.学习的过程实为不易,从刚开始的一无所知时的苦苦挣扎,到学有所得后的应对有

使用EventBus进行Fragment和Activity通信

使用EventBus进行Fragment和Activity通信 本文介绍EventBus的基本使用,以及用于Fragment和Activity之间通信. github地址: https://github.com/greenrobot/EventBus 版本是 EventBus-2.4.0 release EventBus是基于订阅和发布的一种通信机制,使用流程如下: 实例化EventBus对象 注册订阅者 发布消息 接受消息 对应代码 EventBus eventBus = new EventB