
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所示。

图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所示。

图4-11 项目结构
布局文件activity_main.xml如下:

MainActivity主要代码如下:


定义Fragment类代码如下:

程序运行结果如图4-12和图4-13所示。

图4-12 运行结果1

图4-13 运行结果2
【程序说明】
● 在要用到Fragment的Activity所对应的XML文件中添加fragment控件。
● 要为tab添加name属性(android:name="包名.Fragment类名")和id属性(如不加id,会在程序运行时出现闪退)。