- Android移动应用开发技术与实践
- 夏辉 杨伟吉 张瑾主编
- 763字
- 2021-09-17 17:53:29
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=1739516488-Wb9i114CsIqAgbfEYfozImzoBFC5i3jr-0-bc19670b9b25a3684d8587ff436059f6)
图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=1739516488-QSQQS49DLd0cUzbaK0THc1xoQkF0j1M0-0-d04473f423a37c4176d340f9fc9a0c5b)
图4-11 项目结构
布局文件activity_main.xml如下:
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/105_01.jpg?sign=1739516488-zseTjcuEBOAVPjqiBokIhTLWBdyiXRDE-0-89aa34d8d3cf42bdf7439c1751dfd890)
MainActivity主要代码如下:
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/105_02.jpg?sign=1739516488-IyT3e80CUqPkfgG4o6vNXjPpibna2rtB-0-f35d6203bd7228000b04152699304d82)
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/106_01.jpg?sign=1739516488-JAmid3zSRx4cII41YCaD26kb8GrI6jtc-0-0f7d0135cfa548020c7ad876fafb49ee)
定义Fragment类代码如下:
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/106_02.jpg?sign=1739516488-eE8GqpnazZa49vFD5iCqt31pcyuF4Hus-0-83e00022674b0c9fe0c22ba76935d357)
程序运行结果如图4-12和图4-13所示。
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/106_03.jpg?sign=1739516488-1p65yJKfzjVnDk4PH2zGGOSSArUX1KXR-0-e622d8a3860f034a63177540c94eeb9c)
图4-12 运行结果1
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/106_04.jpg?sign=1739516488-z4VIMmoYVEoLJU3AiSPDPlWOvJCPwm5v-0-ddd95c577def52a35af7b5f776e01c23)
图4-13 运行结果2
【程序说明】
● 在要用到Fragment的Activity所对应的XML文件中添加fragment控件。
● 要为tab添加name属性(android:name="包名.Fragment类名")和id属性(如不加id,会在程序运行时出现闪退)。