Fragment表示 Activity中的行为或用户界面部分。您可以将多个片段组合在一个 Activity 中来构建多窗格 UI,以及在多个 Activity 中重复使用某个片段。您可以将片段视为 Activity 的模块化组成部分,它具有自己的生命周期,能接收自己的输入事件,并且您可以在 Activity 运行时添加或移除片段(有点像您可以在不同 Activity 中重复使用的“子 Activity”)。
片段必须始终嵌入在 Activity 中,其生命周期直接受宿主 Activity 生命周期的影响。 例如,当 Activity 暂停时,其中的所有片段也会暂停;当 Activity 被销毁时,所有片段也会被销毁。 不过,当 Activity 正在运行(处于已恢复生命周期状态)时,您可以独立操纵每个片段,如添加或移除它们。 当您执行此类片段事务时,您也可以将其添加到由 Activity 管理的返回栈 — Activity 中的每个返回栈条目都是一条已发生片段事务的记录。 返回栈让用户可以通过按返回按钮撤消片段事务(后退)。
当您将片段作为 Activity 布局的一部分添加时,它存在于 Activity 视图层次结构的某个 ViewGroup内部,并且片段会定义其自己的视图布局。您可以通过在 Activity 的布局文件中声明片段,将其作为 <fragment>
元素插入您的 Activity 布局中,或者通过将其添加到某个现有 ViewGroup,利用应用代码进行插入。不过,片段并非必须成为 Activity 布局的一部分;您还可以将没有自己 UI 的片段用作 Activity 的不可见工作线程。
1. 为什么说Fragment被称为是第五大组件
Android 在 Android 3.0(API 级别 11)中引入了片段,主要是为了给大屏幕(如平板电脑)上更加动态和灵活的 UI 设计提供支持。由于平板电脑的屏幕比手机屏幕大得多,因此可用于组合和交换 UI 组件的空间更大。利用片段实现此类设计时,您无需管理对视图层次结构的复杂更改。 通过将 Activity 布局分成片段,您可以在运行时修改 Activity 的外观,并在由 Activity 管理的返回栈中保留这些更改。
Fragment的运用为Android开发带来了质的飞跃,解决了碎片化的问题,在不同屏幕尺寸和分辨率上都能有合理的展示,极大地提高了用户的体验。
2. Fragment生命周期
为更好的理解,结合Activity,如下图:
- 在Fragment中调用Activity中的方法
getActivity()
;- 在Activity中调用Fragment中的方法
接口回掉
;- 在Fragment中调用Fragment中的方法
findFragmentById()
。
3. Fragment加载到Activity中的方法:
主要有两种方法:静态加载&动态加载
1. 静态加载:添加Fragment到Activity的布局文件中;
2. 动态加载:
- 添加一个
FragmentTransaction
实例;- 用
add()
方法加上Fragment的对象;- 调用
commit()
方法使得FragmentTransaction
实例的改变生效。
4.FragmentPagerAdapter与FragmentStatePagerAdapter的区别
FragmentPagerAdapter:保存所有加入的fragment,虽然步长超过1的页面会调用destroyItem,但是在fragment的生命周期里,只有onDestroyView调用了,没有调用onDestory,也没有调用onDetach,所以fragment只是把上面的view销毁了,fragment并没有销毁,下次再创建的时候,只会调用onCreateView和onActivityCreated,所以FragmentPagerAdapter里所有fragment都没有销毁,这样占用内存大,同时避免了频繁的销毁和创建,适用于页面比较少的情况。
FragmentStatePagerAdapter:对步长以内的fragment,跟FragmentPagerAdapter一样,不会调用任何销毁操作,再次显示也无需重新创建,对步长以外的fragment会调用destroyItem,跟FragmentPagerAdapter不一样,会真正销毁(同时销毁view和fragment,调用onDestroyView以及其后面的所有销毁方法),重建时会从最初的onAttach开始一直到onActivityCreated,适用于页面比较多的情况。
- 当page数量少,用FragmentPagerAdapter;
- 反之则用FragmentStatePagerAdapter;
- 它们两的Fragment生命周期在ViewPage的切换过程中都会重复执行多次,所以它都不适用于App主页Tab。
5. 一些方法
主要的操作都是FragmentTransaction的方法:
FragmentTransaction transaction = fm.benginTransatcion();//开启一个事务
- transaction.add() :往Activity中添加一个Fragment;
- transaction.remove() :从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈,这个Fragment实例将会被销毁;
- transaction.replace():使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体;
- transaction.hide():隐藏当前的Fragment,仅仅是设为不可见,并不会销毁
- transaction.show():显示之前隐藏的Fragment
- detach():会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。
- attach():重建view视图,附加到UI上并显示。
- transatcion.commit():提交一个事务