Android筆記(20):UI元件 Spinner 下拉選單

Photo by Mika Baumeister on Unsplash


在 Android 中提供了兩種清單類元件,一個是 Spinner 下拉式選單,用於彈出一個下拉式功能表讓用戶選擇;另一種是 ListView 列表視圖,通常用於一個視窗中只顯示一個清單使用。而由於它們又間接繼承自 AdapterView,所以它們都可以採用合適的方式顯示多個清單項。

[Spinner]

下拉選單(Spinner)通常用於提供一組預先設定好的資料選項讓用戶選擇,使用下拉的方式呈現,目的在於節省畫面空間,在屏幕上看起來較為簡潔。在 Android 的 XML 佈局檔中透過 <Spinner>標記增加下拉式選單,基本語法格式如下:
<Spinner
   android:屬性 = "值"> 
</Spinner>
Spinner 元件間接繼承自 ViewGroup,是屬於容器類元件,可以直接使用 ViewGroup 支援的屬性和方法,其他常用的屬性如下:
XML屬性描述
entries使用陣列資源設置下拉式清單方塊的清單專案,指定清單項目給 Spinner。
prompt設定下拉式選單的標題。
dropDownHorizontalOffset設定下拉清單的水準偏移距離。
dropDownVerticalOffset設定下拉清單方塊的水準豎直距離。
dropDownSelector下拉清單被選中時的背景。
dropDownWidth設定下拉清單的寬度。
gravity設定元件的對齊方式。
popupBackground設定下拉清單的背景。
prompt設定下拉清單的提示標題,只能夠引用 string.xml 中的資源ID,而不能直接寫字串。
spinnerMode下拉清單的模式,有兩個可選值:
dialog :對話方塊風格的視窗,
dropdown :下拉式功能表風格的視窗(預設)。

要建立下拉選單的清單項目有兩個方法:一是定義在 res\values 目錄內的 XML 檔,XML 檔可以是已存在的 strings.xml 或新建一個自己命名的 XML 檔,然後透過字串陣列資源來為下拉選單提供選項,這個方法不需寫 java 程式。另一個方法是撰寫 java 程式,透過 Adapter 來建立清單。這裡我們先來瞭解第一種方法。


[建立陣列資源檔及取用]

在 res/values 目錄中建立一個定義陣列資源的 XML 檔 arrays.xml。先將左方的 res 目錄內,對 values 目錄按右鍵 →[New]→[Values Resource File],如下圖:
輸入 arrays.xml 當作資源檔檔名。
在資源檔中,依格式輸入列表清單中的項目:

[程式範例]

(1)新建一個模組 Module,在 res/values 目錄下新增一個字串陣列檔,名為 arrays.xml,定義內容如下:
<resources>
    <string-array name="spinnerValue">
        <item>電視</item>
        <item>洗衣機</item>
        <item>電冰箱</item>
        <item>咖啡機</item>
        <item>冷氣</item>
        <item>電扇</item>
        <item>其他</item>
    </string-array>
</resources>

(2) 進入 res/layout 目錄下點選佈局檔 activity_main.xml。將預設的內容刪除,建立 1 個 TextView 文字框,1 個 Spinner,以下是完整 XML 的內容。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="50sp"
        android:text="請選擇適合的家電用品:"
        android:textSize="24sp" />

    <Spinner
        android:id="@+id/sp"
        android:entries="@array/spinnerValue"
        android:layout_width="200sp"
        android:layout_marginLeft="20sp"
        android:layout_marginTop="50sp"
        android:layout_height="50sp" />

</LinearLayout>

(3)在 MainActivity.java 在 onCreate() 方法內,先建立與佈局檔的物件,用 findValueById 連結 Spinner 元件,設定 setOnItemSelectedListener 監聽器,如果偵測到選項,執行 getItemAtPosition 得知目前按下的值,使用 Toast 顯示在畫面上。程式碼如下:
package com.example.myspinner;

import androidx.appcompat.app.AppCompatActivity;

import android.content.res.Resources;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

public class spinner_MainActivity extends AppCompatActivity {

    private Spinner sp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_spinner_main);

        sp = (Spinner) findViewById(R.id.sp);

        // 設定 sp 元件 ItemSelected 事件的 listener
        sp.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView parent, View view, int position, long id) {
                String result = parent.getItemAtPosition(position).toString();
                Toast.makeText(spinner_MainActivity.this, result, Toast.LENGTH_LONG).show();
            }

            @Override
            public void onNothingSelected(AdapterView parent) {

            }
        });
    }
}

執行的結果如下:

[參考資料]


Post a Comment

較新的 較舊