Spinner

Spinner是一種下拉式選單元件,提供多個選項讓使用者選擇,平時為收縮起來狀態,只會出現目前被選取的項目,節省佔據螢幕的空間。

建立Spinner選單有兩種方式,用程式或XML資源檔。

用程式建立Spinner選單

步驟一:在版面資源檔XML內建立一個Spinner元件如下:
<Spinner
    android:id="@+id/spnList"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:drawSelectorOnTop="true"
    android:transcriptMode="alwaysScroll"
    android:spinnerMode="dialog"
    android:prompt="@string/spnPrompt" />
Spinner屬性說明:
android:drawSelectorOnTop true, false 被選擇的項目是否要被反白的顏色遮住,true為反白的顏色會遮住被選擇的文字。
android:transcriptMode disabled, normal, alwaysScroll 自動捲動設定。
android:spinnerMode dialog, dropdown 清單顯示方式,dialog為對話盒方式,dropdown為下拉式選單。
android:prompt 顯示在元件上方的提示訊息。
步驟二:在程式碼中關聯Spinner元件
Spinner spnList = (Spinner)findViewById(R.id.spnList);
步驟三:建立String陣列,定義好要顯示的清單項目
String[] strArray = new String[] {"選項一", "選項二", "選項三"};
步驟四:建立資料型態為StringArrayAdapter物件
ArrayAdapter<String> adapList = new ArrayAdapter(this, android.R.layout.simple_spinner_item, strArray);
adapList.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

android.R.layout.simple_spinner_itemandroid.R.layout.simple_spinner_dropdown_item都是Android內建的選單樣式。而在建立Adapter物件時傳入的樣式為Spinner靜止時的顯示樣式,setDropDownViewResource()為設定選單被下拉時的樣式,兩種樣式可以不同,如果打算一樣時,可以省略setDropDownViewResource()的呼叫。

步驟五:將Adapter傳遞給給Spinner

spnList.setAdapter(adapList);

建立傾聽器, 用來處理選項被選擇時的通知

// 建立Spinner傾聽器
Spinner.OnItemSelectedListener spnListener = new Spinner.OnItemSelectedListener()
{
    public void onItemSelected(AdapterView<?> parent, View v, int position, long id) 
    {
        // 將選項被選擇時要做的事情寫在這個方法內
    }

    public void onNothingSelected(AdapterView<?> arg0) 
    {
    }   
};

將傾聽器設定給Spinner

spnList.setOnItemSelectedListener(spnListener);

使用XML資源檔的方式建立Spinner選單

當Spinner內的清單項目是固定時,也可以使用XML來建立清單,以利維護及減少程式碼。要使用XML來建立清單,步驟與用程式建立大同小異,只有在定義清單項目的陣列與建立ArrayAdapter這兩個步驟不同,也就是步驟三和步驟四。

步驟三:透過string-array元素來定義清單項目
<xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="stringArray">
        <item>項目一</item>
        <item>項目二</item>
        <item>項目三</item>
    </string-array>
</resources>
步驟四:建立資料型態為CharSequenceArrayAdapter物件
ArrayAdapter<CharSequence> adapList = 
                                ArrayAdapter.createFromResource(this, 
                                                                R.array.stringArray, 
                                                                android.R.layout.simple_spinner_item);
adapList.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

自訂Spinner內文字樣式(大小、顏色等等)

新增一個XML資源檔,並定義根元素為TextView: myspinner_style.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:textColor="#FF0000"
    android:textSize="24sp"
    android:textStyle="bold">
</TextView>
修改步驟四:Adapter建構式第二個參數和setDropDownViewResource()第一個參數:
ArrayAdapter<String> adapList = new ArrayAdapter(this, R.layout.myspinner_style, strArray);
adapList.setDropDownViewResource(R.layout.myspinner_style);

將原本使用內建樣式改為使用我們自行定義的XML TextView。

提示:當選單下拉時顯示的樣式打算和未下拉時的樣式一樣時,可以不需要呼叫setDropDownViewResource()