ColorStateList是能夠把申請的顏色定義在XML中的一個對象,但是它實際上會根據使用這個ColorStateList對象的View對象的狀態,來改變顏色。例如,Button控件存在幾種不同的狀態之一(按下、聚焦、或者都不是),並且它要使用一個顏色狀態列表,在每個狀態期間,可以提供不同的顏色。
可以在一個XML文件中描述這個狀態列表。每個顏色被定義在一個<selector>元素內部的<item>元素中。每個<item>元素使用各種屬性來描述它應該用於那個狀態中。
每個狀態改變期間,會從上到下遍歷狀態列表,第一個被找到的與當前狀態匹配的顏色會被使用,這個選擇不是基於最佳匹配,而是簡單選擇遇到的第一個滿足條件的項目。
註意:如果要提供靜態顏色資源,請使用簡單的Color值。
文件位置(FILE LOCATION):
Res/color/filename.xml,文件名被做資源的ID。
被編譯的資源數據類型(COMPLILED RESOURCE DATATYPE):
資源指向一個ColorStateList對象。
資源引用(RESOURCE REFERENCE):
在Java代碼中:R.color.filename
在XML中:@[package:]color/filename
語法(SYNTAX):
<?xml version="1.0" encoding="utf-8"?>
<selectorxmlns:android="http://schemas.android.com/apk/res/android">
<item
android:color="hex_color"
android:state_pressed=["true" | "false"]
android:state_focused=["true" | "false"]
android:state_selected=["true" | "false"]
android:state_checkable=["true" | "false"]
android:state_checked=["true" | "false"]
android:state_enabled=["true" | "false"]
android:state_window_focused=["true" | "false"] />
</selector>
元素(ELEMENTS):
<selector>
必須的,它必須是根元素。包含一個或多個<item>元素。
屬性(ATTRIBUTES):
xmlns:android:
字符串,必須的。它定義瞭XML的命名空間,必須是“http://schemas.android.com/apk/res/android”。
<item>
定義某個狀態期間使用的顏色,顏色會做為這個元素的一個屬性。它必須是<selector>元素的子元素。
屬性(ATTRIBUTES):
android:color
十六進制顏色,必須的。顏色是用RGB值來指定的,並且可選擇alpha通道。
這個值始終是用#字符開頭,後面跟的是Appha-Red-Green-Blue信息,格式如下:
#RGB
#ARGB
#RRGGBB
#AARRGGBB
android:state_pressed
一個佈爾值,如果這個項目是在對象被按下時使用,那麼就要設置為true。(如,按鈕被觸摸或點擊時。)false應該用於默認的非按下狀態。
android:state_focused
一個佈爾值,如果這個項目是在對象獲取焦點時使用,那麼就要設置為true。如,一個選項標簽被打開時。如果這個項目要用於對象沒有被被選擇的時候,那麼就要設置為false。
android:state_checkable
一個佈爾值,如果這個項目要用於對象的可選擇狀態,那麼就要設置為true。如果這個項目要用於不可選狀態,那麼就要設置為false。(它隻用於一個對象在可選和不可選之間的轉換)。
android:state_checked
一個佈爾值,如果這個項目要用於對象被勾選的時候,那麼就要設置為true。否者設為false。
android:state_enabled
一個佈爾值,如果這個項目要用於對象可用狀態(接受觸摸或點擊事件的能力),那麼就要設置為true,否者設置為false。
android:state_window_focused
一個佈爾值,如果這個項目要用於應用程序窗口的有焦點狀態(應用程序是在前臺),那麼就要設置為true,否者設置false。
註意:要記住,狀態列表中一個與對象當前狀態匹配的項目會被使用。因此,如果列表中的第一項沒有包含以上任何一種狀態屬性,那麼每次都會使用這個項目,因此默認設置應該始終被放到最後。
例子(EXAMPLE):
XML文件被保存在res/color/button_text.xml中:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:color="#ffff0000"/> <!– pressed –>
<item android:state_focused="true"
android:color="#ff0000ff"/> <!– focused –>
<item android:color="#ff000000"/> <!– default –>
</selector>
佈局XML會把這個顏色列表應用與一個View對象:
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/button_text"
android:textColor="@color/button_text"/>
摘自 FireOfStar的專欄