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) { } }); } }
執行的結果如下:
[參考資料]
- Developer : String resources
- Developer : Spinner
- 碁峰出版社: Android 初學特訓班(第三版)
張貼留言