簡單講,Spinner 就是下拉選單,因為下拉選單的資料來源可以是靜態也可以動態,資料呈現方式也是條列式,幾乎可以說是 ListAdapter 與 ListView 的孿生兄弟,唯一的差別在於 ListAdapter 與 ListView 用在整頁顯示的 ListActivity,而 Spinner 用在局部顯示的下拉選單上。
XML layout 如下,一個特別的地方是要加上 prompt 屬性,作為下拉視窗的標題:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Spinner android:id="@+id/spinner" android:layout_width="fill_parent" android:layout_height="wrap_content" android:prompt="@string/spinner_title" /> </LinearLayout>Activity 程式如下:
public class B_Adapter extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Spinner spinner = (Spinner) this.findViewById(R.id.spinner); ArrayAdapter<String> adapter = this.createArrayAdapter(); adapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); } private ArrayAdapter<String> createArrayAdapter() { String[] array = new String[] { "禮拜一", "禮拜二", "禮拜三", "禮拜四", "禮拜五" }; return new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, array); } }特別的地方是,要提供兩個 layout,一個是下拉選單未展開的樣貌,另一個是展開的樣貌,這裡建議用 Android 提供的範本,其他的設定跟 在 Android 裡使用 ListActivity, ListView, ListAdpater 沒有兩樣,一樣可以用 ArrayAdapter、SimpleAdapter 或 SimpleCursorAdapter 三種 adapter。
雖然有 ListAdapter 與 SpinnerAdapter 之別,但是實做的類別是一樣的,也就是說 ArrayAdapter、SimpleAdapter 或 SimpleCursorAdapter 同時實做 ListAdapter 與 SpinnerAdapter interface,因此不管是在 ListView 或者 Spinner 裡,用的都是 ArrayAdapter、SimpleAdapter 或 SimpleCursorAdapter 同一個類別。
執行結果如下:
點擊 Spinner 後彈出下拉選單,實做方法跟 HTML 的 Select 不一樣。
Spinner 可以使用與 ListView 一樣的 Event Listeners,但是實務上會用的只有 OnItemSelectedListener。
為什麼要叫 Spinner?Spinner 有紡紗機的意思,其實把它想可以展開收合的做捲軸會比較好理解,但不管是紡紗機或捲軸,都是在形容 HTML 裡的 Select,Android 裡是用彈出視窗實做,就比較難想像了。
android.R.layout.simple_spinner_item 與 android.R.layout.simple_spinner_dropdown_item 小探險
分別將 android-sdk\platforms\android-8\data\res\layout\android.R.layout.simple_spinner_item.xml 與 android-sdk\platforms\android-8\data\res\layout\android.R.layout.simple_spinner_dropdown_item.xml 抽出來,再另外加上一個空的 Spinner。
結果如下:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#F1C763" > <Spinner android:id="@+id/spinner" android:layout_width="fill_parent" android:layout_height="wrap_content" android:prompt="@string/spinner_title" /> <Spinner android:id="@+id/spinner2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:prompt="@string/spinner_title" /> <TextView style="?android:attr/spinnerItemStyle" android:singleLine="true" android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="marquee" android:text="haha"/> <CheckedTextView style="?android:attr/spinnerDropDownItemStyle" android:singleLine="true" android:layout_width="match_parent" android:layout_height="?android:attr/listPreferredItemHeight" android:ellipsize="marquee" android:text="haha"/> </LinearLayout>
黃色背景是用來凸顯 TextView 的文字,可以發現 Spinner 的構成方式。
沒有留言:
張貼留言