Android Fragment的使用
定义
Fragment可以理解成一个迷你型的活动,同样可以包含布局,同样有自己的生命周期。比Activity要轻量级,在程序内部做界面跳转要比Activity快的多。
静态添加
Fragment可以静态或者动态的添加到Activity中,其中静态情况下,直接在layout.xml中添加fragment节点,并指定android:name属性就可以启动相应的fragment.
动态添加
可以在Activity中通过覆盖onCreate()函数来动态添加Fragment
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null){
getSupportFragmentManager().beginTransaction().add(R.id.container, new MainFragment()).commit();
}
}
动态替换:
在Fragment中可以通过添加按钮事件接收器覆盖当前的fragment:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View rootView = inflater.inflate(R.layout.fragment_main, container, false); rootView.findViewById(R.id.btnShowAnotherFragment).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getFragmentManager().beginTransaction()
.addToBackStack(null)
.replace(R.id.container, new AnotherFragment())
.commit();
}
});
注意,一个静态添加的Fragment,通过这种动态的方法进行替换会造成两个Fragment在Framelayout中的重叠。
生命周期:
当一个B Fragment被另一个A fragment启动的时候会执行B oncreate, A onPause, A onDestroyView,B oncreateview
这个A Fragment并不会执行A onDestroy。
当按Back键返回时会执行B onPause, B onDestroyView, B onDestroy销毁, A onCreateView。
碎片与活动的通信
关于这个问题有一片文章总结的比较好:Android:Activity与Fragment通信(99%)完美解决方案
要想在活动中得到碎片的实例,需要调用FragmentManager的findFragmentById()函数,反过来如果想在碎片中得到活动的实例需要调用getActivity()函数。
如果fragment需要调用activity的函数,则需要保存activity的实例,并定义一个接口,让activity去实现,这样就可以通过fragment保存的实例去调用了。这样做的主要问题是耦合太多,如果activity改变,比如被删除了,那么fragment的代码也需要被更改。
解决方法
定义一个baseFragment类,在其中保存 一个baseActivity类的实例。baseActivity的功能是有一个回调函数可以在baseFragment被onAttach的时候调用,这个函数会将所有的会被fragment调用的函数添加到一个HashMap中,只要在Activity中实现了这个接口,就可以保证在onAttach的时候被添加进来。添加机制定义好之后,只要在我们要定义的activity中实现这个接口,那么就一定会被包含在我们的HashMap中,以供调用。 一个Functions实例。Functions实例就是我们保存HashMap的地方。 当调用的时候,会直接取得这个实例并进行调用。 至此,Activity通过固定的接口进行添加接口函数以供fragment调用,当添加删除Activity的时候Fragment完全不需要改动,当这个fragment被attach到哪一个activity的时候它所能进行的调用就都由Activty侧定义了,fragment要做的就是发起调用,说白了就是以 固定的方式进行activity和fragment之间的函数调用,没啥意思。
其他
当一个Activity执行onPause()的时候,这个Activity中所有的Fragment都会执行onPause() 当一个Fragment被作为layout的Item添加进来的时候,是不可以被删除的 所有的Fragment之间的通信都是靠Activity,两个Fragment之间不能直接通信。
Android Fragment的使用的更多相关文章
- 【Android自学日记】【转】Android Fragment 真正的完全解析(下)
上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和各种API,如果你还不了解,请看:Android Fragment 真正的完全解析(上). 本篇将介绍上篇博客提到的:如何管理Frag ...
- Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理
Toolbar作为ActionBar使用介绍 本文介绍了在Android中将Toolbar作为ActionBar使用的方法. 并且介绍了在Fragment和嵌套Fragment中使用Toolbar作为 ...
- Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复
Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状 ...
- Android Fragment使用(二) 嵌套Fragments (Nested Fragments) 的使用及常见错误
嵌套Fragment的使用及常见错误 嵌套Fragments (Nested Fragments), 是在Fragment内部又添加Fragment. 使用时, 主要要依靠宿主Fragment的 ge ...
- Android Fragment使用(一) 基础篇 温故知新
Fragment使用的基本知识点总结, 包括Fragment的添加, 参数传递和通信, 生命周期和各种操作. Fragment使用基础 Fragment添加 方法一: 布局里的标签 标识符: tag, ...
- Android Fragment应用实战
现在Fragment的应用真的是越来越广泛了,之前Android在3.0版本加入Fragment的时候,主要是为了解决Android Pad屏幕比较大,空间不能充分利用的问题,但现在即使只是在手机上, ...
- Android Fragment 真正的完全解析(下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37992017 上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和 ...
- Android Fragment
1.Fragment必须是依存与Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期. 2.Fragment 生命周期: 首页 最新文章 在线课程 业界 开发 ...
- Android Fragment应用实战,使用碎片向ActivityGroup说再见
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/13171191 现在Fragment的应用真的是越来越广泛了,之前Android在3 ...
- Android Fragment完全解析
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8881711 我们都知道,Android上的界面展示都是通过Activity实现的, ...
随机推荐
- widgets、dialogs与自动连接(auto-connect)
QMetaObject的自动连接设施(auto-connect facilities)可以自动将槽与信号连接起来,只需要声明和定义一个符合标准命名规则的槽函数 void on_<object n ...
- tomact的work目录
1. 用tomcat作web服务器的时候,部署的程序在webApps下,这些程序都是编译后的程序(发布到tomcat的项目里含的类,会被编译成.class后才发布过来,源文件没有发布过来,但这里的j ...
- nignx 负载均衡的几种算法介绍
负载均衡,集群必须要掌握,下面介绍的负载均衡的几种算法. 1 .轮询,即所有的请求被一次分发的服务器上,每台服务器处理请求都相同,适合于计算机硬件相同. 2.加权轮询,高的服务器分发更多的请求 ...
- 浅谈html5及其新特性
什么是 HTML5? HTML5 将成为 HTML.XHTML 以及 HTML DOM 的新标准. HTML 的上一个版本诞生于 1999 年.自从那以后,Web 世界已经经历了巨变. HTML5 仍 ...
- python连接mysql的驱动
对于py2.7的朋友,直接可以用MySQLdb去连接,但是MySQLdb不支持python3.x.这是需要注意的~ 那应该用什么python连接mysql的驱动呢,在stackoverflow上有人解 ...
- winform异步系统升级—BackgroundWorker
BackgroundWorker用法实例 自己的代码,就是要执行的代码写到dowork里,ProgressChanged事件是控制进度时用的,最后的Completed事件进度完成,也就是dowork里 ...
- JQuery_元素样式操作
元素样式操作包括了直接设置CSS 样式.增加CSS 类别.类别切换.删除类别这几种操作方法.而在整个jQuery 使用频率上来看,CSS 样式的操作也是极高的,所以需要重点掌握. 一.css()方法 ...
- C语言局部变量和全局变量的区别。——Arvin
局变量是使用相同的内存块在整个类中存储一个值. 全局变量的存在主要有以下一些原因: 1,使用全局变量会占用更多的内存(因为其生命期长),不过在计算机配置很高的今天,这个不成为什么问题,除非使用的是巨 ...
- 阿里云docker
https://cr.console.aliyun.com docker 安装mysql image sudo docker pull mysql docker 运行 mysql docker r ...
- windows使用python3.4生成二维码
1.首先下载qrcode库 使用pip命令: pip install qrcode python3.x以上的版本默认是安装好pip的,如果出现无法找到pip指令的信息的话,则需要首先安装pip. 2. ...