Android開發筆記-下拉式選單

內容說明:建立下拉式選單(Spinner)、Adapter的使用、在XML裡建立陣列常數

資料來源:Google!Android 2手機應用程式設計入門第三版

在「表單元件設計」有說明了按鈕等基本表單物件的建立方式,這篇要介紹的則是下拉式選單。建立下拉式選單,請先在 res/layout/main.xml 裡拉出一個 Spinner 物件。在這裡需要注意的是 Prompt 屬性,在下拉式選單彈出的時候,會以 Prompt 作為提示語,下面的圖例會顯示。Prompt屬性值不可以直接輸入文字,必需要先在value/strings.xml裡建立好,或是在程式裡使用setPrompt()設定。Spinner物件的XML範例如下:

<spinner android:id="@+id/Spinner01"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:prompt="@string/spinner_prompt">
</spinner>

想要替下拉式選單加入選項內容,必需要先用陣列產生選項,再傳給Spinner。但是在Android程式裡,陣列是不能夠直接傳值給介面元件的,必需要透過Adapter將陣列值傳給Spinner。這個模式和 ListActivity 的建立方式是類似的,不過在不同的情況下,要選用不同的Adapter。

在程式中宣告陣列並餵給Adapter方法在「ListActivity」有介紹過了,所以這裡就在XML檔裡建立陣列常數。請先開啟res/value/strings.xml檔,並建立字串陣列如下:

<string-array name="items">
        <item>item 1</item>
        <item>item 2</item>
        <item>item 3</item>
        <item>item 4</item>
        <item>item 5</item>
    </string-array>

接著回到主程式中,在onCreate將陣列載入Spinner裡:

Spinner spinner_items = (Spinner) findViewById(R.id.Spinner01);
        //從res/values/string.xml讀取資料到Spinner
        ArrayAdapter< charsequence> adapter = ArrayAdapter.createFromResource(this,
                R.array.items,
                android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner_items.setAdapter(adapter);

請和ListActivity的載入方式做比較。因為是從XML檔載入,所以型別是(請自行刪除程式中的空白),而且不需要new ArrayAdapter,而是直接呼叫createFromResource()。注意這裡的順序是this, array, layout。simple_spinner_item 和 simple_spinner_dropdown_item 都是系統內建的預設樣式。最後把adapter丟給spinner變數就可以完成選取的動作。

要取得選取值可以使用「getSelectedItem()」或「getSelectedItemPosition()」;設定預設值則使用「setSelection()」。

如果要在使用者選取項目時產生事件,則要先建立Listener(參考表單元件設計)。根據系統產生的Listener方法修改如下:

spinner_items.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){

            @Override
            public void onItemSelected(AdapterView parent, View v, int position, long id) {
                // parent = 事件發生的母體 spinner_items
                // position = 被選擇的項目index = parent.getSelectedItemPosition()
                // id = row id,通常給資料庫使用

            }

            @Override
            public void onNothingSelected(AdapterView parent) {}
    });