Tab標(biāo)簽頁(yè)是Android系統(tǒng)界面設(shè)計(jì)時(shí)經(jīng)常使用的界面控件,可以實(shí)現(xiàn)多個(gè)分頁(yè)之間的快速切換,每個(gè)分頁(yè)可以顯示不同的內(nèi)容。
對(duì)Tab標(biāo)簽頁(yè)的使用,首先要設(shè)計(jì)所有的分頁(yè)的界面布局,在分頁(yè)設(shè)計(jì)完成后,使用代碼建立Tab標(biāo)簽頁(yè),并給每個(gè)分頁(yè)添加標(biāo)識(shí)和標(biāo)題,后確定每個(gè)分頁(yè)所顯示的界面布局。其中,每個(gè)分頁(yè)建立一個(gè)XML文件,用以編輯和保存分頁(yè)的界面布局,使用的方法與設(shè)計(jì)普通用戶(hù)界面一樣。
下面就通過(guò)一個(gè)例子來(lái)加深對(duì)Tab標(biāo)簽頁(yè)的理解,如圖1所示的效果圖。

圖1 Tab標(biāo)簽頁(yè)效果圖
1.建立一個(gè)“TabDemo”程序
程序包含兩個(gè)XML文件,分別為tab1.xml和tab2.xml,這兩個(gè)文件分別使用線性布局、相對(duì)布局和絕對(duì)布局示例中的main.xml的代碼,并將布局的ID分別定義為layout01和layout02。
其中,tab1.xml文件代碼如代碼清單1所示。
代碼清單1 tab1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id = "@+id/layout01"
…
</LinearLayout>
tab2.xml文件代碼如代碼清單5-24所示。
代碼清單5-24 tab2.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/layout03"
…
</RelativeLayout>
2.修改TabDemo.java文件
在TabDemo.java文件中輸入代碼清單5-25所示的代碼,創(chuàng)建Tab標(biāo)簽頁(yè),并建立子頁(yè)與界面布局直接的關(guān)聯(lián)關(guān)系。
代碼清單5-25 TabDemo.java
package com.example.TabDemo;
import android.app.TabActivity;
import android.os.Bundle;
import android.widget.TabHost;
import android.view.LayoutInflater;
public class TabDemo extends TabActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TabHost tabHost = getTabHost();
LayoutInflater.from(this).inflate(R.layout.tab1,
tabHost.getTabContentView(),true);
LayoutInflater.from(this).inflate(R.layout.tab2,
tabHost.getTabContentView(),true);
tabHost.addTab(tabHost.newTabSpec("TAB1")
.setIndicator("線性布局").setContent(R.id.layout01));
tabHost.addTab(tabHost.newTabSpec("TAB2")
.setIndicator("相對(duì)布局").setContent(R.id.layout02));
}
該段代碼中,第8行代碼“public class TabDemo extends TabActivity”的聲明TabDemo類(lèi)繼承于TabActivity,與以往繼承Activity不同,TabActivity支持內(nèi)嵌多個(gè)Activity或View。
第12行代碼“TabHost tabHost = getTabHost();”通過(guò)getTabHost()方法獲得Tab標(biāo)簽頁(yè)的容器,用以承載可以點(diǎn)擊的Tab標(biāo)簽和分頁(yè)的界面布局。
第13行代碼“LayoutInflater.from(this).inflate(R.layout.tab1, tabHost. getTabContent
View(),true);”通過(guò)LayoutInflater將tab1.xml文件中的布局轉(zhuǎn)換為T(mén)ab標(biāo)簽頁(yè)可以使用的View對(duì)象。
第14行代碼“tabHost.addTab(tabHost.newTabSpec("TAB1").setIndicator("線性布局").setContent(R.id.layout01));”使用addTab()方法添加了第1個(gè)分頁(yè),tabHost.newTabSpec
("TAB1")表明在第12行代碼中建立的tabHost上,添加一個(gè)標(biāo)識(shí)為T(mén)AB1的Tab分頁(yè),同時(shí)使用setIndicator()方法設(shè)定分頁(yè)顯示的標(biāo)題,使用setContent()方法設(shè)定分頁(yè)所關(guān)聯(lián)的界面布局。
在使用Tab標(biāo)簽頁(yè)時(shí),除了像上述中將不同分頁(yè)的界面布局保存在不同的XML文件中外,也可以將所有分頁(yè)的布局保存在同一個(gè)XML文件中。兩者有不同的利弊:
第一種方法有利于在Eclipse開(kāi)發(fā)環(huán)境中進(jìn)行可視化設(shè)計(jì),并且不同分頁(yè)的界面布局在不同的文件中更加易于管理。
第二種方法則可以產(chǎn)生較少的XML文件,同時(shí)編碼時(shí)的代碼也會(huì)更加簡(jiǎn)潔。