前言
TabHost是用来在一个界面显示多个标签的组件,现在已经被Fragment代替,原因是可扩展性非常差,并且需要依赖ActivityGroup。现在对它进行学习是为了学习它构建界面的特点,更好的理解Android的UI。
TabHost组件在安卓4.0之后已经被废弃了,建议使用Fragment组件来代替它。由于其设计违反了Activity单一窗口原则,它可以同时加载多个Activity,然后再它们之间进行来回切换;另外有个很致命的问题就是当点击别的选项时,按下Back后退键,它会使整个应用程序都退出,而不是切换到前一个选项卡,虽然可以在主程序里覆写OnKeyDown这个方法,但这样就会导致每一次按下Back后退键都只能回到第一个选项菜单。
一:TabHost 简介
作用:TabHost可以很方便的在窗口上放置多个标签页,每个标签页相当于获得一个与外部容器相同大小的组件拜放区域。通过这种方式就可以在一个容器里放置更多组件。
结构:TabHost是整个Tab的容器,包含TabWidget和FrameLayout两个部分,TabWidget是每个Tab的标签,FrameLayout是Tab内容。
与TabHost结合使用的有如下两个组件:
TabWidget:代表选项卡的标题条
TabSpec:代表选项卡的一个Tab页面
重要方法
TabHost仅仅是一个容器,可以使用下面的方法来创建,添加标签页。
newTabSpec(String tag):创建选项卡
addTab(TabHost.TabSpec tabSpec):添加选项卡
实现TabHost的方式
- 直接让一个Activity继承TabActivity
- 定义xml布局文件,利用findViewById()获得TabHost组件,通过setup()方法实例化并进行配置
需要注意的地方:
- TabHost的布局根元素设置为TabHost
- 需要有TabWidget和FrameLayout
- 三个id必须要设置对,否则会报错
Your content must have a TabHost whose id attribute is 'android.R.id.tabhost'
- TabHost的id必须为@android:id/tabhost
- TabWidget的id必须为@android:id/tabs
- FrameLayout的id必须@android:id/tabcontent
二:示例代码
方法一:继承TabActivity
<?xml version="1.0" encoding="utf-8"?>
<TabHost
android:id="@android:id/tabhost"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TabWidget
android:id="@android:id/tabs"
android:layout_width="match_parent"