Android中使用TabHost和TabWidget來(lái)實(shí)現(xiàn)選項(xiàng)卡功能。TabHost必須是布局的根節(jié)點(diǎn),它包含兩個(gè)子節(jié)點(diǎn):
站在用戶(hù)的角度思考問(wèn)題,與客戶(hù)深入溝通,找到宿城網(wǎng)站設(shè)計(jì)與宿城網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶(hù)體驗(yàn)好的作品,建站類(lèi)型包括:網(wǎng)站制作、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、網(wǎng)頁(yè)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋宿城地區(qū)。
TabWidget,顯示選項(xiàng)卡;
FrameLayout,顯示標(biāo)簽內(nèi)容。
實(shí)現(xiàn)選項(xiàng)卡功能有兩種方法,一種是將多個(gè)View放在同一個(gè)Activity中,然后使用使用標(biāo)簽來(lái)進(jìn)行切換。另一種是直接使用標(biāo)簽切換不同的Activity。
后一種方法更為常用一些。
1. 創(chuàng)建一個(gè)工程,名字可以叫HelloTabWidget。
2. 創(chuàng)建多個(gè)不同的Activity,用來(lái)表示各個(gè)標(biāo)簽頁(yè)中的不同內(nèi)容。
3. 為標(biāo)簽設(shè)計(jì)不同的icon。每個(gè)標(biāo)簽應(yīng)該有兩個(gè)icon,一個(gè)表示選中,一個(gè)未選中。將圖片放在 res/drawable/文件夾下。然后創(chuàng)建一個(gè)相應(yīng)的
StateListDrawable,用來(lái)實(shí)現(xiàn)在選中和未選中直接自動(dòng)的切換。
第一步
res/values/strings.xml
[xhtml] view plain copy
?xml version="1.0" encoding="utf-8"?
resources
string name="hello"Hello World, MyTabActivity!/string
string name="app_name"選項(xiàng)卡Demo/string
string name="andy"Andy Rubin--a href="" class='replace_word' title="undefined" target='_blank' style='color:#df3434; font-weight:bold;'Android/a的創(chuàng)造者/string
string name="bill"Bill Joy--Java的創(chuàng)造者/string
string name="torvalds"Linus Torvalds --Linux之父/string
/resources
第二步
res/layout/tab_layout.xml
[xhtml] view plain copy
?xml version="1.0" encoding="utf-8"?
!--
FrameLayout:一個(gè)FrameLayout對(duì)象好比一塊在屏幕上提前預(yù)定好的空白區(qū)域,
然后可以填充一些元素到里邊,比方說(shuō)一張圖片等。
需要注意的是所有元素都被放置在FrameLayout區(qū)域的左上的區(qū)域,
而且無(wú)法為這些元素指定一個(gè)確切的位置。如果有多個(gè)元素,則后邊的會(huì)重疊在前一個(gè)元素上。
android:gravity用于設(shè)置View組件的對(duì)齊方式
(另外,android:layout_gravity用于設(shè)置Container組件的對(duì)齊方式)
center_horizontal 不改變控件大小,對(duì)其到容器橫向中間位置(也就是在豎直方向的中間)
android:scaleType="fitXY" 把圖片不按比例來(lái)擴(kuò)大或者縮小顯示
--
FrameLayout xmlns:android=""
android:layout_width="fill_parent"
android:layout_height="fill_parent"
LinearLayout android:id="@+id/linearLayout1"
xmlns:android=""
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
ImageView
android:id="@+id/imageView01"
android:layout_gravity="center"
android:scaleType="fitXY"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/andy"/
TextView
android:id="@+id/testView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dip"
android:text="@string/andy"
/
/LinearLayout
LinearLayout android:id="@+id/linearLayout2"
xmlns:android=""
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
ImageView
android:id="@+id/imageView02"
android:layout_gravity="center"
android:scaleType="fitXY"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/bill"/
TextView
android:id="@+id/testView02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dip"
android:text="@string/bill"
/
/LinearLayout
LinearLayout android:id="@+id/linearLayout3"
xmlns:android=""
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
ImageView
android:id="@+id/imageView03"
android:layout_gravity="center"
android:scaleType="fitXY"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/torvalds"/
TextView
android:id="@+id/testView03"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dip"
android:text="@string/torvalds"
/
/LinearLayout
/FrameLayout
第三步
src/com/myandroid/tab/MyTabActivity.java
[java] view plain copy
package com.myandroid.tab;
import android.app.TabActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.widget.TabHost;
public class MyTabActivity extends TabActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TabHost tabHost = this.getTabHost();
/*
* LayoutInflater的作用類(lèi)似于 findViewById(),
* 不同點(diǎn)是LayoutInflater是用來(lái)找layout文件夾下的xml布局文件,并且實(shí)例化
* 注:findViewById()只是找控件之類(lèi)(如Button和EditView)
*
* LayoutInflater.from(this)獲得context實(shí)例
* 也就是相當(dāng)于this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
* LAYOUT_INFLATER_SERVICE 取得xml里定義的view
*-----------------------------------------------------------------------
* getSystemService:
* 根據(jù)傳入的NAME來(lái)取得對(duì)應(yīng)的Object,然后轉(zhuǎn)換成相應(yīng)的服務(wù)對(duì)象
* android的后臺(tái)運(yùn)行在很多service,
* 它們?cè)谙到y(tǒng)啟動(dòng)時(shí)被SystemServer開(kāi)啟,支持系統(tǒng)的正常工作,
* 比如MountService監(jiān)聽(tīng)是否有SD卡安裝及移除,ClipboardService提供剪切板功能,
* 應(yīng)用程序可以通過(guò)系統(tǒng)提供的Manager接口來(lái)訪問(wèn)這些Service提供的數(shù)據(jù)
*-----------------------------------------------------------------------
*
* inflate是把xml表述的layout轉(zhuǎn)化為View
* tabHost.getTabContentView() 獲得Tab標(biāo)簽頁(yè)的FrameLayout
* true表示將inflate綁定到根布局元素上
*/
LayoutInflater.from(this)
.inflate(R.layout.tab_layout,
tabHost.getTabContentView(), true);
/*
* tabHost.newTabSpec("Tab1") 創(chuàng)建TabHost.TabSpec,
* TabSpec即是選項(xiàng)卡的指示符,對(duì)于TabSpec可以設(shè)置一個(gè)標(biāo)題或者設(shè)置一個(gè)標(biāo)題和圖標(biāo)
* setIndicator 是為選項(xiàng)卡指示符指定一個(gè)標(biāo)簽和圖標(biāo)
* setContent 為選項(xiàng)卡的內(nèi)容指定視圖的ID
*/
tabHost.addTab(
tabHost.newTabSpec("Tab1")
.setIndicator("Tab1", getResources().getDrawable(R.drawable.png1)
).setContent(R.id.linearLayout1)
);
tabHost.addTab(
tabHost.newTabSpec("Tab2")
.setIndicator("Tab2", getResources().getDrawable(R.drawable.png2)
).setContent(R.id.linearLayout2)
);
tabHost.addTab(
tabHost.newTabSpec("Tab3")
.setIndicator("Tab3", getResources().getDrawable(R.drawable.png3)
).setContent(R.id.linearLayout3)
);
}
}
第四步
AndroidManifest.xml
[xhtml] view plain copy
?xml version="1.0" encoding="utf-8"?
manifest xmlns:android=""
package="com.myandroid.tab"
android:versionCode="1"
android:versionName="1.0"
application android:icon="@drawable/icon" android:label="@string/app_name"
activity android:name=".MyTabActivity"
android:label="@string/app_name"
intent-filter
action android:name="android.intent.action.MAIN" /
category android:name="android.intent.category.LAUNCHER" /
/intent-filter
/activity
/application
uses-sdk android:minSdkVersion="8" /
/manifest
附上出處鏈接:
在布局中用TabHost,必須有一個(gè)TabWidget的子控件,并且控件id一定要是android預(yù)先定義的“android:id/tabs”,你只寫(xiě)一個(gè)TabHost當(dāng)然會(huì)報(bào)這個(gè)錯(cuò)