7.3.6 选项卡控件

选项卡控件(Tab Control)是一种常用的容器控件,用来作为导航模块以快速切换关联功能的交互界面。它的实现类是android.widget.TabHost,派生自FrameLayout。

选项卡控件包含若干个选项卡(Tab),每个选项卡由一个标签(Tab Widget)和对应内容界面构成。所有的标签汇聚在标签页控件android.widget.TabWidget中,被选中标签项的相关内容界面会呈现在用户面前。当用户点击标签时,内容界面会随着当前选择标签的变化而发生变化,开发者也可以在代码中调用TabHost.setCurrentTab函数来进行切换。

通过TabHost.addTab函数可以动态地增加选项卡,每个选项卡都可以用TabHost.TabSpec对象来进行描述。调用TabSpec.setIndicator函数可以为选项卡设置标签。每个标签默认由一个图标和一段描述文字共同构成,Android SDK 1.6以上的版本还支持用自定义控件对象替换默认的标签对象。

使用TabSpec.setContent函数可以为选项卡设置内容界面,选项卡控件支持以下几种设置内容区域的方式:

1)通过控件标识(id)。将选项卡的内容设置为界面组件中已有的某个控件对象,本质上就是控制该控件对象的可视性。控件会在整个界面组件加载时就被加载出来,不论该选项卡是否被选中。当选项卡被选中时,对应的控件对象就成为可见状态。

2)通过选项卡工厂TabHost.TabContentFactory。与前一种方式不同,通过选项卡工厂构造选项卡内容,是将控件对象的构造延迟到用户第一次选择对应的选项卡时。与通过控件标识进行设定相比较,它更节省内存开销,实现也更为整洁。

3)通过界面组件。前两种方式从本质上而言,都是控制该界面组件中控件对象的可视性,而通过界面组件设置选项卡内容界面,则是利用Intent对象,将选项卡的内容区域设置成为某个界面组件对象,使得选项卡控件成为一个界面组件的集合。这是选项卡控件最常见的使用方式,它能够充分利用意图机制来整合已有的界面组件,以界面组件作为功能单元,实现功能的整合。

将界面组件整合在选项卡控件下,利用了本地界面组件(Local Activity)的功能。它通过LocalActivityManager对象构造界面组件,并将该界面组件与其宿主界面组件建立父子关系。本地化的界面组件不会被加入到任务栈中,因此也不支持退栈操作,不会被独立地回收,它的生命周期与其父界面组件紧密地绑定到了一起。

通过Activity.getParent的方法可以获取父控件对象,并且,通过它还可以实现父界面组件和子界面组件的通信:


//获得父界面组件

Activity parent=getParent();

//判断父界面组件是否存在

if(parent!=null&&

parent instanceof TheParentActivity){

//与父界面组件进行通信

((TheParentActivity)parent).sendMessageToParent();

}


对父界面组件的调用无形中增加了界面组件间的耦合性,使界面组件丧失了部分黑盒特征。所以,开发者在调用时要格外注意,一定要通过类型判定等手段来保持界面组件的独立性。