Android中Fragment生命周期和基本用法
1.基本概念
1. Fragment是什么?
Fragment是可以让你的app纵享丝滑的设计,如果你的app想在现在基础上性能大幅度提高,并且占用内存降低,同样的界面Activity占用内存比Fragment要多,响应速度Fragment比Activty在中低端手机上快了很多,甚至能达到好几倍!如果你的app当前或以后有移植平板等平台时,可以让你节省大量时间和精力。
下图是文档中给出的一个Fragment分别对应手机与平板间不同情况的处理图:
2. Fragment优点
- Fragment可以使你可以将activity分离成多个可以重用的组件,每个都有它自己的生命周期和UI。
- Fragment可以轻松的创建动态灵活的UI设计,可以适用于不同的屏幕尺寸。从手机到平板电脑
- Fragment是一个独立的模块,紧紧地与activity绑定在一起。可以运行中动态地移除、加入、交换等。
- Fragment提供一个新的方式让你在不同的安卓设备上统一你的UI。
- Fragment 解决Activity间的切换不流畅,轻量切换。
- Fragment 替代TabActivity做导航,性能更好。
- Fragment 在4.2.版本中新增嵌套fragment使用方法,能够生成更好的界面效果。
- Fragment做局部内容更新更方便,原来为了到达这一点要把多个布局放到一个activity里面,现在可以用多Fragment来代替,只有在需要的时候才加载Fragment,提高性能
3.Fragment的生命周期图
具体回调方法:
onAttach:onAttach()在fragment与Activity关联之后调调查用。需要注意的是,初始化fragment参数可以从getArguments()获得,但是,当Fragment附加到Activity之后,就无法再调用setArguments()。所以除了在最开始时,其它时间都无法向初始化参数添加内容。
onCreate:fragment初次创建时调用。尽管它看起来像是Activity的OnCreate()函数,但这个只是用来创建Fragment的。此时的Activity还没有创建完成,因为我们的Fragment也是Activity创建的一部分。所以如果你想在这里使用Activity中的一些资源,将会获取不到。比如:获取同一个Activity中其它Frament的控件实例。(代码如下:),如果想要获得Activity相关联的资源,必须在onActivityCreated中获取。
onCreateView:在这个fragment构造它的用户接口视图(即布局)时调用。
onActivityCreated:在Activity的OnCreate()结束后,会调用此方法。所以到这里的时候,Activity已经创建完成!在这个函数中才可以使用Activity的所有资源。如果把下面的代码放在这里,获取到的btn_Try的值将不会再是空的!
onStart:当到OnStart()时,Fragment对用户就是可见的了。但用户还未开始与Fragment交互。在生命周期中也可以看到Fragment的OnStart()过程与Activity的OnStart()过程是绑定的。意义即是一样的。以前你写在Activity的OnStart()中来处理的代码,用Fragment来实现时,依然可以放在OnStart()中来处理。
onResume:当这个fragment对用户可见并且正在运行时调用。这是Fragment与用户交互之前的最后一个回调。从生命周期对比中,可以看到,Fragment的OnResume与Activity的OnResume是相互绑定的,意义是一样的。它依赖于包含它的activity的Activity.onResume。当OnResume()结束后,就可以正式与用户交互了。
onPause:此回调与Activity的OnPause()相绑定,与Activity的OnPause()意义一样。
onStop:这个回调与Activity的OnStop()相绑定,意义一样。已停止的Fragment可以直接返回到OnStart()回调,然后调用OnResume()。
onDestroyView:如果Fragment即将被结束或保存,那么撤销方向上的下一个回调将是onDestoryView()。会将在onCreateView创建的视图与这个fragment分离。下次这个fragment若要显示,那么将会创建新视图。这会在onStop之后和onDestroy之前调用。这个方法的调用同onCreateView是否返回非null视图无关。它会潜在的在这个视图状态被保存之后以及它被它的父视图回收之前调用。
onDestroy:当这个fragment不再使用时调用。需要注意的是,它即使经过了onDestroy()阶段,但仍然能从Activity中找到,因为它还没有Detach。
onDetach:Fragment生命周期中最后一个回调是onDetach()。调用它以后,Fragment就不再与Activity相绑定,它也不再拥有视图层次结构,它的所有资源都将被释放。
2.创建一个Fragment
1.静态加载Fragment
实现流程:
- 定义Fragment的xml布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#00ff00" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="This is fragment 1" android:textColor="#000000" android:textSize="25sp" /> </LinearLayout>
- 自定义Fragment类,需要继承Fragment类或者其子类,同时实现onCreateView()方法。在方法中,通过inflater.inflate加载布局文件,接着返回view即可
public class Fragmentone extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment1, container,false);return view;}
}
- 在需要加载Fragment的Activity对应的布局文件中fragment的name属性需要为全限定类名,即包名.fragment 例如:com.jay.example.fragment1
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:baselineAligned="false" > <fragment android:id="@+id/fragment1" android:name="com.harvic.com.harvicblog2.Fragment1" android:layout_width="0dip" android:layout_height="match_parent" android:layout_weight="1" /> <fragment android:id="@+id/fragment2" android:name="com.harvic.com.harvicblog2.Fragment2" android:layout_width="0dip" android:layout_height="match_parent" android:layout_weight="1" /> </LinearLayout>
- Activity调用setContentView()加载布局文件即可
public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }
}
2.动态加载Fragment
实现流程:
获取FragmentManager对象,通过getFragmentManager();
获取FragmentTransaction对象,通过 fragment.beginTransaction();
调用add()方法或者replace()方法加载Fragment;add(要传入的容器,fragment对象)
在前面的基础上还需要调用commit()方法提交事物,当然还有其他的方法,例如remove。
操作步骤:
将activity_main.xml文件改成
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:baselineAligned="false" > <Button android:id="@+id/btn_show_fragment1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="显示Fragment1"/> <Button android:id="@+id/btn_show_fragment2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="显示Fragment2"/> <FrameLayout android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>
主界面上有两个按钮和一个FrameLayout布局。这两个按钮分别用来在这个FrameLayout加载Fragment1和Fragment2的实例。效果如下:
其它代码都没有动,主要的是在MainActivity里,点击这两个按钮时做的处理
public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btnLoadFrag1 = (Button)findViewById(R.id.btn_show_fragment1); btnLoadFrag1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { FragmentManager manager = getSupportFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); Fragment1 fragment1 = new Fragment1(); transaction.add(R.id.fragment_container, fragment1); transaction.commit(); } }); Button btnLoagFrag2 = (Button)findViewById(R.id.btn_show_fragment2); btnLoagFrag2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { FragmentManager manager = getSupportFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); Fragment2 fragment2 = new Fragment2(); transaction.add(R.id.fragment_container, fragment2); transaction.commit(); } }); }
}
在点击按钮时都做了类似的操作:
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
Fragment1 fragment1 = new Fragment1();
transaction.add(R.id.fragment_container, fragment1);
transaction.commit();
动态添加Fragment主要分为4步:
1.获取到FragmentManager,在V4包中通过getSupportFragmentManager,在系统中原生的Fragment是通过getFragmentManager获得的。
2.开启一个事务,通过调用beginTransaction方法开启。
3.向容器内加入Fragment,一般使用add或者replace方法实现,需要传入容器的id和Fragment的实例。
4.提交事务,调用commit方法提交。
资料参考
Android中Fragment生命周期和基本用法相关推荐
- android viewpager fragment 生命周期,ViewPager中Fragment的生命周期
网上有很多Fragment生命周期的帖子,但是看了一下,没有找到自己想了解的东西,于是决定自己动手体验一下这个生命周期.主要想了解以下几个问题: Activity中的Fragment的生命周期 Vie ...
- android 理解Fragment生命周期
官网帮助文档链接: http://developer.android.com/guide/components/fragments.html 主要看两张图,和跑代码 一,Fragment的生命周 二 ...
- Android中Service生命周期、启动、绑定、混合使用
一.Activity和Service如何绑定: 1.Service和Activity之间的连接可以用ServiceConnection来实现.实现一个ServiceConnection对象实例,重写o ...
- Android零基础入门第86节:探究Fragment生命周期
2019独角兽企业重金招聘Python工程师标准>>> 一个Activity可以同时组合多个Fragment,一个Fragment也可被多个Activity 复用.Fragment可 ...
- Android Fragment 生命周期及其正确使用(建议使用自定义View替换Fragment)
使用Fragment 官方例子中显示: 例如:一个学生Fragment,需要传入studentId,进行http请求显示,那么setArguments后防止杀掉Fragment后,参数为0,显示不了数 ...
- Fragment在ViewPager中的生命周期
转载自 hdszlk的博客 原文链接:https://www.2cto.com/kf/201607/530540.html 1.一直以来的疑问 Fragment在ViewPager到底经历了哪 ...
- android屏幕旋转生命周期,Activity、Fragment生命周期---横竖屏切换的生命周期
先贴出一张大家众所周知activity流程图 onCreate():创建Activity调用,用于Activity的初始化,还有个Bundle类型的参数,可以访问以前存储的状态.onStart():A ...
- Android:Fragment生命周期(结合Activity的生命周期进行分析)
文章目录 前言 一.Fragment生命周期概述 启动 退出 二.Fragment生命周期细述 1.onCreate(Bundle) 2.onCreateView(LayoutInflater, Vi ...
- android fragment 生命周期
今天,简单讲讲fragment 的生命周期. 其实,对于fragment ,大家都很熟悉.我也经常使用,但是最近做一个功能时,在activity里面调用fragment 的函数,发现变量居然没有初始化 ...
最新文章
- Django Python:完整的BUNDLE + Django真实项目2021
- android 美颜,「照骗」要消失了?Android 11 或禁用自动美颜
- free查看可用缓存
- redis的持久化方式有哪些?
- python字符串的split replace strip
- 单高斯分布模型GSM,高斯混合模型GMM
- Apache httpd 配置HTTPS SSL访问 443
- selenium-cookie相关的操作-0223
- 长期演进技术(LTE,Long Term Evolution)
- 近期要养成的学习习惯
- 《自动驾驶网络解决方案白皮书》研读(一):电信产业自动驾驶网络探索与实践
- Ubunt sudo免密码输入
- 预测自适应滤波_使用自适应滤波的时间序列预测
- springboot 导出文件_开发阶段,将SpringBoot应用快速部署到K8S - 程序员欣宸
- 插件制作教程 php,HYBBS插件开发教程 (简单插件) 初识篇
- OpenEmu MAME核心自动更新解决
- eSPI自学笔记(一):前言和简介
- 使用Mybaties xml的增删改查
- mbp网速很慢_mac网速慢的解决办法_mac上网速度极其慢如何处理-win7之家
- 【简七理财笔记】第七课:巧用信用卡,该薅的羊毛就要薅
热门文章
- hash地址_hash 算法原理及应用漫谈
- 实验四恶意代码分析技术 201421430029
- Shell脚本学习-阶段三
- 【操作系统/OS笔记05】非连续内存分配:分段、分页、页表
- 【写给以前的自己】python中,既生list何生tuple?简论学习数据结构(e.g.哈希化)对自己的提升
- 熟悉 scrollTop ,轻松做5个方面的事情。
- linux服务器内存占用太高-释放内存
- 【C#版本详情回顾】C#2.0主要功能列表
- 什么样的博文才能上首页呢?『博客使用技巧』
- linux下svn常用命令集锦