清單元件實作-下拉式選單Spinner

作者 | 2016-03-26

實作前應先瞭解清單元件與Adapter的關係,請參考文章:

清單元件介紹(ListView-Adapter)

下拉式選單-Spinner

下拉選單元件是提供使用者選擇清單中的其中一項的元件,它也是清單的其中一種,清單的資料除了在類別中定義之外,比較常用的方式是在專案的「res/values/」資料夾下定義字串陣列,優點是方便未來修改資料時不需動到類別的程式設計,直接改xml檔即可,另一個最大的優點是可實作多國語言,可定義不同語系使用的字串陣列。

準備字串陣列資料

字串陣列可以定義在「res/values/」的任何一個XML檔案中,亦可以在這個資料夾下再新增一個名稱為「array.xml」的資源檔,專門放字串陣列,方法如下:

在專案下的「res/values」資料夾上按下滑鼠右鍵,選擇「New/Values resource file」,如下圖:

A4324

輸入檔名「array.xml」後按下OK,如下圖:

A4325

在「resources」元素內,新增「array」元素並定義此陣列的名稱「notify_array」,並在其中新增幾個「item」元素,如下:

A4326

加入Spinner元件

請開啟專案下的res/layout/content_main.xml,在左方的元件區的「Widgets」分類下找到「Spinner」元件,點擊後放置在畫面預覽區適當的位置,如下圖:

A4327

提示

在練習時若原本畫面中已有元件(如上節已在版面中放入ListView元件)而無空間時,可先設定元件的「visibility」屬性為「gone」,可保留原本的舊元件,但又不會在畫面中干擾,可再放入新的元件。未來想要顯示時再將「visibility」屬性改為「visible」即可。

再連擊剛才放進入的Spinner,為其設定id屬性為「notify_spinner」,如下圖:

A4328

使用ArrayAdapter

再開啟MainActivity,在onCreate方法中使用findViewById取得Spinner元件,如下:

因為陣列是放在專案資源中,可使用ArrayAdapter的類別方法createFromResource,直接產生一個ArrayAdapter<CharSequence>的物件,如下:

方法中的參數說明:

第一個參數為Context,使用this關鍵字即可。

第二個參數是陣列資源的ID值,給予R.array.notify_array

第三個參數代表未來清單顯示時使用的版面配置,使用的是Android SDK的版面XML「simple_spinner_item」。

最後再將nAdapter物件設定至Spinner元件中,如下:

執行結果如下,尚未選擇前,預設選擇第一個項目:

A4329

點擊後出現清單供使用者選擇,如下圖:

A4330

上述使用的是簡單的清單版面,如果不想要清單項目像上圖如此擁擠,可再加入呼叫ArrayAdapter的setDropDownViewResource方法設定一個比較美觀的版面配置,如下:

效果如下圖:

A4331

選擇項目的事件處理

當使用者選擇了清單中的某一項目的時候進行一些程式設計,就需要使用事件處理,可以為Spinner元件加入「AdapterView.OnItemSelectedListener」,字面上的意思是「當項目選擇時的傾聽器」,它是個Java介面,使用匿名類別設計如下:

A4332

當選擇某一項目後會自動執行第34行的「onItemSelected」方法內的程式碼,若是未選擇(清單出現時按下返回時)則會執行「onNothingSelected」方法內的程式碼。

在onItemSelected方法中以Toast浮動方塊顯示選擇了的項目文字,如下:

A4333

當選擇「只有提示音時」,會出現浮動文字,執行的結果如下圖:

A4338

取得選擇的項目

在需要取得目前Spinner元件中選擇的項目時,可使用Spinner的getSelectedItem方法,即可取得目前的項目物件,回傳值為Object,如果是字串資料,可再呼叫toString方法取得,如下:

相關文章:

Category: Adapter Android ListView 標籤:,

關於 Hank Tom

專長為程式語言、雲端服務開發,Linux系統管理, 任職:利拓科技 技術長,海林行動科技 技術總監 輔仁大學 兼任助理教授 ,為 Android高效入門>深度學習、CentOS 7建置、管理與伺服器架設實戰、Java網路程式設計、雲端網頁程式設計-Google App Engine應用實作 等書作者

使用Facebook直接回應

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *