清單元件實作-下拉式選單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應用實作 等書作者

7 thoughts on “清單元件實作-下拉式選單Spinner

  1. taco2548

    您好,我在實作這個章節時有兩個問題,
    首先是我輸入帳號密碼進行登入,切換Activity時後,除了彈出”登入成功”的浮動文字外,緊接著也彈出了”永不”的浮動文字,請問這是什麼原因?
    另外想請問setDropDownViewResource的使用時機,為什麼不直接把想要的版面寫在一開始的地方就好?
    我曾試過將其直接寫成ArrayAdapter nAdapter = ArrayAdapter.createFromResource(
    this, R.array.notify_array, android.R.layout.simple_spinner_dropdown_item);
    效果是一樣的,所以想知道其使用的時機為何?

    回覆
    1. Hank Tom 文章作者

      請檢查Toast出現”永不”的程式碼放在那一個方法內,沒程式碼很難找問題。
      另,Spinner設定方法很多,這只是其中一個。

      回覆
    1. Manager

      如果能有完整資訊的話,會有更多人能夠幫上忙

      回覆
  2. Comment

    格式怪怪的,重新Po一次
    // 遇到一樣的問題,item的寫法要改
    // 原本的:
    //
    //
    //
    //

    // 改這樣就可以:
    // Never
    // Vibrate
    // Sound Only
    // Vibrate and Sound

    *請自行把//拿掉

    回覆
      1. Comment

        我好像有點言不及義,我是要回答”鈞”的問題,因為我也遇到一樣的問題,而我發現可能是item的寫法上出了問題(如我截圖上的原版),本篇內容本身並沒有問題!
        不好意思連續回,搞得像是在亂版= =

        回覆

發表迴響

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