![Android移动应用开发技术与实践](https://wfqqreader-1252317822.image.myqcloud.com/cover/15/40681015/b_40681015.jpg)
4.6 Fragment
Fragment是Android 3.0后引入的一个新的API,它的设计初衷是为了适应大屏幕的平板电脑,当然现在它仍然是平板APP UI设计的宠儿,而且普通手机开发也会加入这个Fragment,可以把它看成一个小型的Activity,又称Activity片段。
4.6.1 Fragment介绍
如果一个很大的界面只有一个布局,写起界面来就会有很多麻烦,而且如果组件多的话管理起来也很麻烦。而使用Fragment可以把屏幕划分成几块,然后进行分组,进行一个模块化的管理,从而可以更加方便地在运行过程中动态地更新Activity的用户界面。另外,Fragment并不能单独使用,它需要嵌套在Activity中使用,尽管它拥有自己的生命周期,但是还是会受到宿主Activity的生命周期的影响。比如,当Activity暂停时,其中的所有片段也会暂停;当Activity被销毁时,其中的所有片段也会被销毁。不过,当Activity正在运行(处于已恢复生命周期状态)时,您可以独立操纵每个片段,如添加或移除它们。当执行此类片段事务时,也可以将其添加到由Activity管理的返回栈,Activity中的每个返回栈条目都是一条已发生片段事务的记录。返回栈让用户可以通过按“返回”按钮撤销片段事务(后退)。
Fragment的生命周期如图4-10所示。
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/104_01.jpg?sign=1739668315-6yYrQ4NSmvCrkOXhpklJro3Zaq0reunp-0-e159e2f61d89b6a21b4178a0b713f12c)
图4-10 生命周期
由于Fragment必须嵌入在Activity中使用,所以Fragment的生命周期和它所在的Activity是密切相关的。假设Activity是暂停状态,当中全部的Fragment都是暂停状态;假设Activity是stopped状态,这个Activity中全部的Fragment都不能被启动;假设Activity被销毁,那么它当中的全部Fragment都会被销毁。可是,当Activity在运行状态,能够独立控制Fragment的状态,比如加上或者移除Fragment,当这样进行Fragment Transaction(转换)的时候,能够把Fragment放入Activity的back stack中,这样用户就能够进行返回操作。
4.6.2 Fragment实例
Activity与Fragment通信,项目结构如图4-11所示。
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/104_02.jpg?sign=1739668315-q5kK4tvm9E3d12r4NOj2zkKGnnCfBPsH-0-3864c043a368aa0a84f786f7946d8673)
图4-11 项目结构
布局文件activity_main.xml如下:
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/105_01.jpg?sign=1739668315-DOgNMpXYDgPOvmghcu19mMjSxal4iVGE-0-b5ef80b2b8c136983e870973746040a6)
MainActivity主要代码如下:
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/105_02.jpg?sign=1739668315-YSCz1Q1jkaiYcUXxGLaQZwqnPbNzisMQ-0-aea1500dd930f69a61cb4b37a9581a30)
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/106_01.jpg?sign=1739668315-kHAde9OlL7EzLkyyLwbkXJYcxeue7xYp-0-8a1c3564af49e91c17e4781ad88edc09)
定义Fragment类代码如下:
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/106_02.jpg?sign=1739668315-ghW8ujEptWIFyOJuFelAO0BmVj6C4GKX-0-04d8a22bcb644d73e9e868d9b7df28f3)
程序运行结果如图4-12和图4-13所示。
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/106_03.jpg?sign=1739668315-6Xaa2EDBZ7NmvyhJQkMDQA5k1ff27IP4-0-a0e3d6188e1f42ae099ca4119ae04126)
图4-12 运行结果1
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/106_04.jpg?sign=1739668315-e1k0E8CNH8563RvsbUc7WGLMrAxuVyAW-0-a6317f8f5e12a2e122eb54936a3f90fc)
图4-13 运行结果2
【程序说明】
● 在要用到Fragment的Activity所对应的XML文件中添加fragment控件。
● 要为tab添加name属性(android:name="包名.Fragment类名")和id属性(如不加id,会在程序运行时出现闪退)。