Activity和Fragment无疑是Android开发中使用最多的组件,如果Activity使用了多个Fragment,需要在Activity与Fragment,以及Fragment与Fragment之间进行数据通讯,这是开发时经常遇到的需求问题,其实在我没整理这篇blog前也遇到过这样的数据通讯需求,下面是后来整理的用接口回调的方式实现Fragment与Fragment之间,以及用Bundler实现Activity与Fragment之间数据通讯,希望能对大家有帮助.

  • 通过接口回调,实现Fragment与Fragment之间数据通讯,逻辑如下:
1.创建一个接口,并在接口里面创建用于处理回调的函数,函数上面声明一个参数,参数的数据类型是Fragment之间通讯的数据类型
2.在一个Fragment中创建用于注册回调的函数,函数上面声明一个参数,参数的数据类型是接口的类型
3.在另外的一个Fragment中创建一个内部类,并且将内部类实现回调的接口并实现接口中的函数,然后在外部类中通过第一个Fragment的类名直接调用第一个Fragment中用于注册回调的函数,将自己内部类的对象作为参数传递
4.实现数据传递时,只要第一个Fragment调用接口中处理数据的函数,那另外一个Fragment就会收到传递的数据

Activity(左边和右边各显示一个Fragment):

public class MainActivity extends Activity {private FragmentManager mManager;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 获取Fragment管理者mManager= getFragmentManager();// 默认左边边显示的FragmentFragmentTransaction leftTr= mManager.beginTransaction();LeftFragment leftFragment = new LeftFragment();leftTr.replace(R.id.fl_left, leftFragment);leftTr.commit();// 默认右边显示的FragmentFragmentTransaction rightTr = mManager.beginTransaction();RightFragment rightFragment= new RightFragment();rightTr.replace(R.id.fl_right, rightFragment);rightTr.commit();}
}

处理回调的接口:

public interface DataListener {//处理数据的函数,接口的实现类必须实现此函数void onData(String data);
}

左边的Fragment:

public class LeftFragment extends Fragment {public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState{View inflate = inflater.inflate(R.layout.left_fragment, null);//调用右边RightFragment的setOnDataListener函数注册接口回调RightFragment.setOnDataListener(new OnDataListener());return inflate;}//用于实现回调的类,实现的是处理回调的接口,并实现接口里面的函数class OnDataListener implements DataListener{//实现接口中处理数据的函数,只要右边的Fragment调用onData函数,这里就会收到传递的数据public void onData(String data) {Toast.makeText(getActivity(), "data="+data, 0).show();}}
}

右边的Fragment:

public class RightFragment extends Fragment {private static DataListener mDataListener;private EditText mEdData;private Button mBtnPut;public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View inflate = inflater.inflate(R.layout.right_fragment, null);mEdData = (EditText) inflate.findViewById(R.id.ed_data);mBtnPut= (Button) inflate.findViewById(R.id.btn_put);mBtnPut.setOnClickListener(new OnClickListener() {public void onClick(View v) {String data = mEdData.getText().toString();//调用接口中处理数据的函数,这里实际是多态的方式调用的是实现类的函数mDataListener.onData(data);}});return inflate;}//创建注册回调的函数public static void setOnDataListener(DataListener dataListener){//将参数赋值给接口类型的成员变量mDataListener = dataListener;}
}

以上是所有的代码,至于Activity与Fragment之间通讯,可以沿用上面的逻辑去实现.

  • 但是还可以用另外一种方法,就是用官方提供的Bundler去实现Activity传递数据到Fragment.
    Activity(传递数据):
public class MainActivity extends Activity {private FragmentManager mManager;private  Button mBtnPutData;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mBtnPutData = (Button) findViewById(R.id.btn_putData);//默认显示的FragmentmManager= getFragmentManager();FragmentTransaction transaction = mManager.beginTransaction();RightFragment fragment = new RightFragment();transaction.replace(R.id.fl_content, fragment);transaction.commit();//向RightFragment传值mBtnPutData.setOnClickListener(new OnClickListener() {public void onClick(View v) {FragmentTransaction transaction = mManager.beginTransaction();RightFragment fragment = new RightFragment();//创建Bundle对象Bundle bundle = new Bundle();//向Bundle输入数据bundle.putInt("data", 100);//对fragment设置Bundle参数fragment.setArguments(bundle);transaction.replace(R.id.fl_content, fragment);transaction.commit();}});}
}

Fragment(接收数据)

public class RightFragment extends Fragment{private EditText mEtData;public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View  inflate = inflater.inflate(R.layout.right_fragment, container,false);mEtData = (EditText) inflate.findViewById(R.id.et_data);//获取Activity传递的Bundle对象Bundle bundle = getArguments();if(bundle != null){//从bundle里面获取key为data的int类型数值int data = bundle.getInt("data");//将值设置到控件上et_data.setText("data="+data);}return inflate;}
}

————————–完 毕————————–

Activity与Fragment,以及Fragment与Fragment之间的数据通讯相关推荐

  1. 【好文推荐】Activity之间的数据传递方法汇总

    在Activity间传递的数据一般比较简单,但是有时候实际开发中也会传一些比较复杂的数据,本节一起来学习更多Activity间数据的传递方法. 1.通过 Intent 传递 我们在进行 Activit ...

  2. 三个activity之间跳转 数据传递_第二百四十二回:Android中Fragment之间的数据传递概述...

    各位看官们大家好,上一回中咱们说的是Android中Activity之间数据传递的例子,这一回咱们说的例子是Fragment之间的数据传递.闲话休提,言归正转.让我们一起Talk Android吧! ...

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

    [正文] 一.接口回调的简单引入: 我们先来看一个简单的接口回调的例子: 新建一个Java工程,然后新建一个包.然后新建一个A.java文件: A.java代码如下: 1 package com.cn ...

  4. android fragment面试,Android fragment之间传递数据的方式?

    方法一: 1.在MainFragment中设置一个setData()方法,在方法中设置更改按钮名称; //MainFragment.java文件中public void setData(String ...

  5. android 小卷毛播放器,Android 音乐播放器的开发教程(四)Activity和Fragment的通信以及Fragment的切换 ----- 小达...

    Activity和Fragment的通信以及Fragment的切换 在上一篇的博客中讲到了,播放器的主界面布局,是由一个activity和一个fragment构成的,activity启动的时候,在其o ...

  6. Fragment 跳转到指定的Fragment 与 Activity跳转到指定的Fragment 的方法

    Fragment 跳转到指定的Fragment 主要分为2中情况 1 同一个Activity上的Fragment 跳转到指定Fragment 例如MainActivity 上的Fragment 跳转问 ...

  7. ConstraintLayout 不能作为activity的根节点,否则fragment显示不出来

    2019独角兽企业重金招聘Python工程师标准>>> ConstraintLayout 不能作为activity的根节点,否则fragment显示不出来 转载于:https://m ...

  8. Android系列之Fragment(一)----Fragment加载到Activity当中

    参考文章出处: 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3978989.html 前言 A ...

  9. Android系列之Fragment(二)----Fragment的生命周期和返回栈

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

最新文章

  1. linux 遇到的问题
  2. 【大数据教程】MapReduce基本架构、统计每个人三次考试成绩的最高分,统计每一个人花费的总流量、按地区,统计每一个人花费的总流量
  3. VUE第三篇 入门后续
  4. 秒懂机器学习---当机器学习遇上决策树....
  5. ADOCE打包到WinCE NK.bin镜像中
  6. 物联网项目--基于RFID的智能咖啡馆(Visual Studio+物联网虚拟仿真实验平台)
  7. 正确设置asp.net网站的404错误页面
  8. c++ signal 信号退出
  9. 想写高质量代码,减少代码负债性?底层和源码这类还是得多用用心
  10. 协程asyncio_初识asyncio协程
  11. 华为云平台使用手册_训练、标注成本节省90%!华为云自动化AI开发平台ModelArts 3.0发布,从训练数据到模型落地一站式打通...
  12. java 配对问题_Java中的配对类是什么?
  13. 服务器向客户端发送数据自动中断
  14. asp.net 连接SQL Server 数据库并进行相关操作
  15. python股票_十分钟学会用Python交易股票
  16. 装黑苹果卡在苹果图标_虚拟机装MAC系统一直卡在苹果标志
  17. python语音通话_如何优雅的用Python玩转语音聊天机器人
  18. 有向加权图 最大弱连通分支_指数基金介绍专栏:指数基金的加权方式,你都知道哪些?...
  19. 自平衡自行车本质就是一个惯性飞轮,本质就是一样的!!!
  20. 单词首字母大写,将每个单词的首字母改为大写后输出

热门文章

  1. 感恩计算机专业作文,感恩作文(精选10篇)
  2. PHP母亲节,用PS设计感恩母亲节字体海报的教程
  3. 淘宝天猫背后,有一个你不知道的神秘组织
  4. 100个台阶,一次走一步,走两步,走三步,有多少种可能
  5. Horizon安装和配置
  6. Stay hungry, Stay young
  7. 一周市场摘抄20210222
  8. 安全(Security)设计原则(1)
  9. 【linux驱动之字符设备驱动基础】
  10. 【网络】计算机网络重点知识总结