Android应用主要的UI框架:TabLayout+ViewPager+Fragment组合方式+宿主Activity

在这样的框架之下,就会涉及到很多控件的交互,fragment与activity交互,由此引申出本次主题, Fragment和Activity之间的交互方式

三种情形:
1.Activity操作内嵌的Fragment
2.Fragment操作宿主Activity
3.Fragment操作同属Activity的其他Fragment

方式:
1.Handler
2.广播
3.EventBus
4.接口回调
5.Bundle和setArgments(bundle)
6,getActivity()、new Fragment()方式

activityhomeFragment=new HomeFragment();
// TODO Auto-generated method stub
homeFragment.changeText();//changeText是fragment中方法Fragment
((MainActivity) getActivity()).changeText();//changeText是activity中方法

接口方式

(1)在fragment中定义一个内部回调接口,再让包含该fragment的activity实现该回调接口,这样fragment即可调用该回调方法将数据传给activity。其实接口回调的原理都一样,以前的博客有讲到,接口回调是java不同对象之间数据交互的通用方法。

(2)activity实现完了接口怎么传给刚才的fragment呢?当fragment添加到activity中时,会调用fragment的方法onAttach(),这个方法中适合检查activity是否实现了OnArticleSelectedListener接口,检查方法就是对传入的activity的实例进行类型转换,然后赋值给我们在fragment中定义的接口。

(3)在一个fragment从activity中剥离的时候,就会调用onDetach方法,这个时候要把传递进来的activity对象释放掉,不然会影响activity的销毁,产生不必要的错误。注意看onAttach方法中的代码,在赋值之前要做一个判断,看看Activity中有没有实现了这个接口,用到了instanceof。如果没有实现接口,我们就抛出异常。
3.2 例子

(1)在宿主activity中,创建Fragment

public class MainActivity extends Activity implements MenuFragment.FragmentInteraction{private TextView textView;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);textView = (TextView) findViewById(R.id.content_text);}// 3.2 +实现接口,实现回调@Overridepublic void process(String str) {if (str != null) {textView.setText(str);}}
}

(2)Fragment中

public class MenuFragment extends Fragment implements View.OnClickListener {// 2.1 定义用来与外部activity交互,获取到宿主activityprivate FragmentInteraction listterner;// 1 定义了所有activity必须实现的接口方法public interface FragmentInteraction {void process(String str);}// 当FRagmen被加载到activity的时候会被回调@Overridepublic void onAttach(Activity activity) {super.onAttach(activity);if(activity instanceof FragmentInteraction) {listterner = (FragmentInteraction)activity; // 2.2 获取到宿主activity并赋值} else{throw new IllegalArgumentException("activity must implements FragmentInteraction");}}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_menu, container, false);View btn = view.findViewById(R.id.tv_button);View btn_m = view.findViewById(R.id.movie_button);if (btn != null||btn_m!=null) {btn.setOnClickListener(this);btn_m.setOnClickListener(this);}return view;}@Overridepublic void onClick(View v) {int id  = v.getId();switch (id) {case R.id.tv_button:listterner.process("我是电视剧"); // 3.1 执行回调break;case R.id.movie_button:listterner.process("我是电影");break;}}//把传递进来的activity对象释放掉@Overridepublic void onDetach() {super.onDetach();listterner = null;}
}

参考:
在一个搜索功能中往往会出现这样一个功能:顶部一个搜索功能,下面是一个TabLayout与ViewPager,VerPager承载着两个Fragment,随着TabLayout与ViewPager的滑动而传递信息告诉相应的Fragment要做的事情,点击顶部的搜索来刷新下面的两个Fragment的数据,并且还要传递搜索的内容和TabLayout的位置

https://www.cxyzjd.com/article/shenggaofei/90145548

Android Fragment和Activity之间的交互方式相关推荐

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

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

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

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

  3. 静态注册fragment_Fragment的静态和动态添加方式以及Fragment和Activity之间的通信方式...

    一.静态添加方式:创建好Fragment之后,在需要使用碎片的Activity的布局文件中添加 标签. 二.动态添加方式:先创建好fragment的布局文件,然后创建一个继承自Fragment的 类( ...

  4. fragment与activity之间的信息传递的两种方式

    因为Fragment和Activity一样是具有生命周期,不是一般的bean通过构造函数传值,会造成异常. fragment与activity之间的信息传递的两种方式: 1.第一种方式,也是最常用的方 ...

  5. Android开发之旅-Fragment和Activity之间onCreateOptionsMenu的联系

    Fragment和Activity一样,可以重写onCreateOptionsMenu方法来设定自己的菜单,其实这两个地方使用onCreateOptionsMenu的目的和效果都是完全一样的,但是由于 ...

  6. Fragment与Activity之间的完美邂逅

    Fragment Activity 看下我实现的效果图这种真的特别常见点击左边的item替换右边的布局文件 MovieContent package view.zm.com.wyimtest.bean ...

  7. Fragment与Activity之间的相互通信

    https://blog.csdn.net/u012702547/article/details/49786417 https://blog.csdn.net/carson_ho/article/de ...

  8. android脚步---不同activity之间参数传递

    现在有两个activity,一个是mainactivity,一个是detectactivity 后者需要调用前者的一个参数,这里用到了intent  getextras(); putextras(); ...

  9. Android两个Activity之间的接口回调

    最近在做个项目时需要在一个Activity中监听网络数据是否有更新,然后在另一个activity中更新,涉及到两个activity之间的接口回调,网上找了很多资料总算是弄出来了 首先定义一个监听接口 ...

最新文章

  1. Android Cordova 对于软键盘弹出后覆盖输入域的解决
  2. 云服务器能否申请多个IP?
  3. Python-str函数
  4. c# 的 textbox 默认情况下是有最大字符长度限制的
  5. 【知识星球】千奇百怪的网络结构板块更新到哪里了?
  6. SpringBoot中在配置文件中限制文件上传的大小
  7. 原生JS基于window.scrollTo()封装垂直滚动动画工具函数
  8. Oracle错误集!
  9. centos8 yum太慢_Yum 慢到无法忍受?那是因为你没有这么做
  10. hystrix基于request cache请求缓存技术优化批量数据查询接口
  11. php里面什么是u函数,ThinkPHP内置函数----U方法
  12. 捏脸是如何实现的?程序化生成3D头像
  13. Linux创建模板封装虚拟机
  14. Map对象 map.get(key)
  15. 线上nacos命名空间误删如何找回 实践笔记
  16. 关于ROS功能包里package.xml和CMakeList.txt的源码分析
  17. linux etc fstab 重启,如何重新挂载/etc/fstab而无须重启
  18. a标签带参数跳转页面,并在跳转页面接受参数
  19. SmartNavigation苗条版ClientNavigation增肥
  20. 饭局狼人杀服务器维护,如果你是腾讯《饭局狼人杀》的产品经理,你打算怎么修复这个致命漏洞?...

热门文章

  1. Groovy系列之简介和特点
  2. Redis 集群原理,再也不怕面试被问倒
  3. windows sftp linux,Windows 下的SFTP服务器配置
  4. 装好卫生间的三大要素
  5. 【Electron】使用Electron将web项目打包成桌面应用程序
  6. 一加Ace怎么样?旗舰机水准的性能王牌
  7. 仅需10%参数量即超越SOTA!浙大、字节、港中文联合提出「类别级位姿估计」任务新框架|CoRL2022...
  8. 以凡人之躯,比肩神明:“ I am iron man ”
  9. Linux将目录设置为所有人都能读写
  10. 1 分钟给 Siri 升个级!从智Z变身 ChatSiri!