Android Fragment和Activity之间的交互方式
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之间的交互方式相关推荐
- Android(Fragment和Activity之间通信)
Fragment的使用可以让我们的应用更灵活的适配各种型号的安卓设备,但是对于Fragment和Activity之间的通信,很多朋友应该比较陌生,下面我们就通过一个实例来看一看如何实现. 一.Acti ...
- Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)
[正文] 一.接口回调的简单引入: 我们先来看一个简单的接口回调的例子: 新建一个Java工程,然后新建一个包.然后新建一个A.java文件: A.java代码如下: 1 package com.cn ...
- 静态注册fragment_Fragment的静态和动态添加方式以及Fragment和Activity之间的通信方式...
一.静态添加方式:创建好Fragment之后,在需要使用碎片的Activity的布局文件中添加 标签. 二.动态添加方式:先创建好fragment的布局文件,然后创建一个继承自Fragment的 类( ...
- fragment与activity之间的信息传递的两种方式
因为Fragment和Activity一样是具有生命周期,不是一般的bean通过构造函数传值,会造成异常. fragment与activity之间的信息传递的两种方式: 1.第一种方式,也是最常用的方 ...
- Android开发之旅-Fragment和Activity之间onCreateOptionsMenu的联系
Fragment和Activity一样,可以重写onCreateOptionsMenu方法来设定自己的菜单,其实这两个地方使用onCreateOptionsMenu的目的和效果都是完全一样的,但是由于 ...
- Fragment与Activity之间的完美邂逅
Fragment Activity 看下我实现的效果图这种真的特别常见点击左边的item替换右边的布局文件 MovieContent package view.zm.com.wyimtest.bean ...
- Fragment与Activity之间的相互通信
https://blog.csdn.net/u012702547/article/details/49786417 https://blog.csdn.net/carson_ho/article/de ...
- android脚步---不同activity之间参数传递
现在有两个activity,一个是mainactivity,一个是detectactivity 后者需要调用前者的一个参数,这里用到了intent getextras(); putextras(); ...
- Android两个Activity之间的接口回调
最近在做个项目时需要在一个Activity中监听网络数据是否有更新,然后在另一个activity中更新,涉及到两个activity之间的接口回调,网上找了很多资料总算是弄出来了 首先定义一个监听接口 ...
最新文章
- Android Cordova 对于软键盘弹出后覆盖输入域的解决
- 云服务器能否申请多个IP?
- Python-str函数
- c# 的 textbox 默认情况下是有最大字符长度限制的
- 【知识星球】千奇百怪的网络结构板块更新到哪里了?
- SpringBoot中在配置文件中限制文件上传的大小
- 原生JS基于window.scrollTo()封装垂直滚动动画工具函数
- Oracle错误集!
- centos8 yum太慢_Yum 慢到无法忍受?那是因为你没有这么做
- hystrix基于request cache请求缓存技术优化批量数据查询接口
- php里面什么是u函数,ThinkPHP内置函数----U方法
- 捏脸是如何实现的?程序化生成3D头像
- Linux创建模板封装虚拟机
- Map对象 map.get(key)
- 线上nacos命名空间误删如何找回 实践笔记
- 关于ROS功能包里package.xml和CMakeList.txt的源码分析
- linux etc fstab 重启,如何重新挂载/etc/fstab而无须重启
- a标签带参数跳转页面,并在跳转页面接受参数
- SmartNavigation苗条版ClientNavigation增肥
- 饭局狼人杀服务器维护,如果你是腾讯《饭局狼人杀》的产品经理,你打算怎么修复这个致命漏洞?...
热门文章
- Groovy系列之简介和特点
- Redis 集群原理,再也不怕面试被问倒
- windows sftp linux,Windows 下的SFTP服务器配置
- 装好卫生间的三大要素
- 【Electron】使用Electron将web项目打包成桌面应用程序
- 一加Ace怎么样?旗舰机水准的性能王牌
- 仅需10%参数量即超越SOTA!浙大、字节、港中文联合提出「类别级位姿估计」任务新框架|CoRL2022...
- 以凡人之躯,比肩神明:“ I am iron man ”
- Linux将目录设置为所有人都能读写
- 1 分钟给 Siri 升个级!从智Z变身 ChatSiri!