![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=1739262336-kIUkHWmfc6UxWOil78YiyrRTjdbFfYY5-0-febed95edad70c40f825a7db05298ea1)
图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=1739262336-Z9ioGxSvaQn8IDjrnAAVWQDyFlgHpsbu-0-45133dcb306b032eb2d729769d5c427d)
图4-11 项目结构
布局文件activity_main.xml如下:
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/105_01.jpg?sign=1739262336-kUdZoU7ciA2pqgVttgbOJlimMt6adRS3-0-a005d3a3a4ba0fd0e42c275a536cd641)
MainActivity主要代码如下:
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/105_02.jpg?sign=1739262336-6IDxsmchUowsSIlpLUXaCOHHNpA7nWW8-0-b4daeb8267002e162d80ab83ed5d6e97)
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/106_01.jpg?sign=1739262336-26BA8jfeSeOAJGZE9uFtloNOuvf77lvt-0-caac5b8c3cf4dc1df951764dfd1f3578)
定义Fragment类代码如下:
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/106_02.jpg?sign=1739262336-qJCR5mbXWJm0MCxtT9JXrjzY0f59GdU2-0-bba7fd15810ac482f034b4e41eaa008d)
程序运行结果如图4-12和图4-13所示。
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/106_03.jpg?sign=1739262336-Mty4fJ4rC2HzPXZE4xN4RkNgTz06U2DN-0-7e229be1490edf38b1f9afe100ee922d)
图4-12 运行结果1
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/106_04.jpg?sign=1739262336-M59vAZ2q1VF7bKeQsKP4CqC4daAWcgwF-0-d481ba79786d81a226763ea9100c9ec3)
图4-13 运行结果2
【程序说明】
● 在要用到Fragment的Activity所对应的XML文件中添加fragment控件。
● 要为tab添加name属性(android:name="包名.Fragment类名")和id属性(如不加id,会在程序运行时出现闪退)。