[Android] Custom TabHost Style

Android裡提供了TabHost,讓開發人員可以製做Tab版型;但是預設的樣式一點都不討喜。如果要自己重新設計版面其實也不太難,先來了解一下Tab裡面到底有哪些東西。

API Level 8

 

Android裡提供了TabHost,讓開發人員可以製做Tab版型;但是預設的樣式一點都不討喜。如果要自己重新設計版面其實也不太難,先來了解一下Tab裡面到底有哪些東西。

image

在TabHost裡面,最主要的二個物件就是TabWidget以及FrameLayout,TabWidget就是上圖看到的Tab頁籤,而FrameLayout則是頁籤內容放置的地方。如果要調整APP整個畫面底色,就可以從TabHost的background屬性下手;或是想要把TabWidget置底,那就可以把TabWidget和FrameLayout的位置互換;不過今天我要自訂的是TabWidget的樣式。

 


<TabHost
    android:id="@android:id/tabhost"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1" >

    <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"
            android:layout_height="wrap_content" >
        </TabWidget>

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >

            <LinearLayout
                android:id="@+id/tab1"
                android:layout_width="match_parent"
                android:layout_height="match_parent" >
            </LinearLayout>
        </FrameLayout>
    </LinearLayout>

</TabHost>

 

TabWidget的xml:custom_tab.xml,我放了一個圖和文字,打算用來顯示每個Tab的icon和說明文字;TabWidget基本會有二種狀態:已選、沒選。所以顏色和圖示以及底色也可以依據狀態自動切換,在這裡先設定來源為@drawable物件。


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/background_color"
    android:paddingTop="5dp"
    android:paddingBottom="5dp"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
	/>

    <TextView
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:layout_gravity="bottom"
        android:textSize="15sp"
        android:textColor="@drawable/text_color"
        android:text="TextView"/>

</LinearLayout>

 

在res資料夾內新增一個drawable資料夾,然後新增以下幾個xml:

background_color.xml:TabWidget的底色切換,selector中可以設定判斷的條件,這邊用的是state_selected,為了有所區別,我額外幫被選取的tab做個圓角。


<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

	<!-- When selected, use grey -->
	<item android:state_selected="true">
		<shape>
			<solid android:color="@drawable/lightsteelblue" />
			<corners 
				android:bottomLeftRadius="10dp" 
				android:bottomRightRadius="10dp" 
				android:topLeftRadius="10dp" 
				android:topRightRadius="10dp" />
		</shape></item>
	<!-- When not selected, use white -->
	<item android:drawable="@drawable/lightgrey"/>

</selector>

text_color.xml:切換文字顏色


<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_selected="true" android:color="#ffffff"></item>
    <item android:color="#808080"></item>

</selector>

icon_cart.xml:icon當然也可以啦,以下這個是購物車的圖示,如果有幾個tab就要建幾個相對應的icon drawable xml。

 


<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
     <!-- When selected, use grey -->
    <item android:drawable="@drawable/ic_cart_black"
          android:state_selected="true" />
    <!-- When not selected, use white-->
    <item android:drawable="@drawable/ic_cart_white" />
</selector>

 

另外為了讓顏色統一使用,所以我在res/values新增了color資源檔:


<?xml version="1.0" encoding="utf-8"?>
<resources>
    <drawable name="white">#ffffff</drawable>
    <drawable name="black">#000000</drawable>
    <drawable name="gray">#7F808080</drawable>
    <drawable name="lightsteelblue">#dfb0c4de</drawable>
    <drawable name="lightgrey">#d3d3d3</drawable>
    
</resources>

 

準備好XML檔,接下來就是程式撰寫:(我是整理成方法了,依照傳入的Activity Class、tab 名稱、tab 標籤文字、圖示的drawable id之後建立TabWidget,之後指定到TabSpec裡。

private void setupTab(Class<?> ccls, String name, String label, Integer iconId) {
    Intent intent = new Intent().setClass(this, ccls);


    View tab = LayoutInflater.from(this).inflate(R.layout.custom_tab, null);
    ImageView image = (ImageView) tab.findViewById(R.id.icon);
    TextView text = (TextView) tab.findViewById(R.id.text);
    if(iconId != null){
        image.setImageResource(iconId);
    }
    text.setText(label);

    TabSpec spec = tabHost.newTabSpec(name).setIndicator(tab).setContent(intent);
    tabHost.addTab(spec);

}

全部做完就會長這樣,還不錯吧?XD

image

 

以上!

 

 

Dotblogs 的標籤: ,