Android學習筆記九:基本視圖組件:Spinner

  接上文 
    在Web開發中,HTML提供了下拉列表的實現,就是使用<select>元素實現一個下拉列表,在其中每個下拉列表項使用<option>表示即可。這是在Web開發中一個必不可少的交互性組件,在Android中的對應實現就是Spinner。
    首先來看一下Spinner的文檔: 
 
java.lang.Object 
   ↳ android.view.View 
   ↳ android.view.ViewGroup 
   ↳ android.widget.AdapterView<T extends android.widget.Adapter> 
   ↳ android.widget.AbsSpinner 
   ↳ android.widget.Spinner
 
    Spinner的繼承結構比較複雜,在繼承樹中有AdapterView,這是比較重要的一項,因爲我們就是通過Adapter來爲Spinner設置下拉列表項的。 
    Spinner的重點問題就是下拉列表項的配置,通過之前組件的瞭解,我們知道資源組件的配置有兩種方式,一種是通過XML文件來配置,一種是通過程序來配置。而從Spinner的文檔中,我們可以看到,對它的配置需要使用Adapter類的實現。 
    下面我們就來看看Spinner的使用,在Eclipse中創建SpinnerDemo項目,編寫代碼: 
Xml代碼  收藏代碼
  1. <TextView  
  2.     android:id="@+id/degreeLabel"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:text="請選擇您的學歷" />  
  6. <Spinner  
  7.     android:id="@+id/degree"  
  8.     android:layout_width="fill_parent"  
  9.     android:layout_height="wrap_content" />  

    這裏放置了一個空的Spinner,直接運行程序,我們看到如下效果: 
 
    就是一個空的下拉框,什麼都沒有,下面我們開始向這個下拉框中設置列表項。首先我們使用XML資源文件的配置方式,在values目錄下創建spinner_data.xml,並設置如下內容: 
Xml代碼  收藏代碼
  1. <string-array name="degrees">  
  2.     <item>初中及以下</item>  
  3.     <item>高中</item>  
  4.     <item>大學</item>  
  5.     <item>研究生及以上</item>  
  6. </string-array>  

    不難理解<string-array>表示字符串的數組,就是可以定義多個字符串的項目,在其中,我們仍然使用<item>來定義每一項,設置好後,將其應用到Spinner中: 
Xml代碼  收藏代碼
  1. <Spinner  
  2.     android:id="@+id/degree"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:entries="@array/degrees" />  

    配置Spinner組件中的entries屬性即可引用我們在spinner_data.xml中定義的degrees項目組了,不難想到,它已經被註冊到R.java中了。運行程序,我們得到如下顯示效果: 
 
    這裏可以看到,我們雖然設置了提示信息,但是點擊下拉框後並沒有出現Spinner的提示,而是直接顯示出了我們設置的選項,這樣的顯示並不是很好看,我們希望在彈出的Spinner選擇框上也給出提示,那麼我們可以這麼來設置: 
Xml代碼  收藏代碼
  1. <Spinner  
  2.     android:id="@+id/degree"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:entries="@array/degrees"  
  6.     android:prompt="@string/degrees_prompt" />  

    也就是在Spinner組件中加上prompt屬性即可,注意這裏不能直接使用文本了,而需要使用引用,那麼我們在strings.xml中加入如下信息: 
Xml代碼  收藏代碼
  1. <string name="degrees_prompt">您的學歷是:</string>  

   我們再次運行程序,就可以看到如下的效果: 
 
    這次再點擊Spinner,彈出的下拉框中就有了提示的prompt,顯示效果好了很多。 
    下面我們看看如何通過程序來控制Spinner和列表項,之前說過要使用程序,就要用到Adapter類,這裏我們使用實現類ArrayAdapter來進行操作。首先我們使用ArrayAdapter讀取XML配置文件的方式來說明: 
Xml代碼  收藏代碼
  1. <string-array name="cities">  
  2.     <item>北京</item>  
  3.     <item>上海</item>  
  4.     <item>大連</item>  
  5. </string-array>  

    我們在spinner_data.xml中再設置一組值來表示城市,有了列表項,我們還需要再創建一個Spinner,那麼在main.xml中,再設置一個Spinner: 
Xml代碼  收藏代碼
  1. <TextView  
  2.     android:id="@+id/cityLabel"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:text="請選擇您所在的城市" />  
  6. <Spinner  
  7.     android:id="@+id/city"  
  8.     android:layout_width="fill_parent"  
  9.     android:layout_height="wrap_content" />  

    那麼在Activity程序中,我們可以如下來編寫代碼: 
Java代碼  收藏代碼
  1. package org.ourpioneer;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. import android.widget.ArrayAdapter;  
  5. import android.widget.Spinner;  
  6. public class SpinnerDemoActivity extends Activity {  
  7.     private Spinner city = null;// 要讀取的下拉列表  
  8.     private ArrayAdapter<CharSequence> cities = null;// 要使用的Adapter  
  9.     public void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         super.setContentView(R.layout.main);  
  12.         city = (Spinner) super.findViewById(R.id.city);// 獲取下拉列表  
  13.         city.setPrompt("您所在的城市是:");// 設置Prompt  
  14.         cities = ArrayAdapter.createFromResource(this, R.array.cities,android.R.layout.simple_spinner_item);// 實例化ArrayAdapter  
  15.         city.setAdapter(cities);// 設置顯示信息  
  16.     }  
  17. }  

    根據代碼中的註釋,不難理解每行代碼的意思,這和在XML中配置Spinner是類似的。要多說的一點就是這裏我們爲ArrayAdapter設置的泛型是CharSequence,而不是直接使用String,這是出於以後對StringBuffer的兼容,來看下CharSequence的文檔: 
 
    不難看出,String和StringBuffer都是CharSequence的子類,這裏定義爲CharSequence後直接使用字符串格式是沒有問題的。 
    下面直接運行程序,我們可以看到如下效果: 
 
    此時列表項的顯示和之前的不同,是因爲我們在實例化ArrayAdapter時使用了android.R.layout.simple_spinner_item,也就是使用了簡單的spinner項。 
    可以通過如下的代碼控制顯示風格: 
Java代碼  收藏代碼
  1. cities.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);// 設置列表項的顯示風格  

    之後再次運行代碼,就可以看到和之前一樣的顯示效果了。 
    下面來看第二種ArrayAdapter的使用方式,就是在程序中動態生成結果來進行填充,我們修改上面的代碼,最終爲: 
Java代碼  收藏代碼
  1. package org.ourpioneer;  
  2. import java.util.Arrays;  
  3. import java.util.List;  
  4. import android.app.Activity;  
  5. import android.os.Bundle;  
  6. import android.widget.ArrayAdapter;  
  7. import android.widget.LinearLayout;  
  8. import android.widget.Spinner;  
  9. import android.widget.TextView;  
  10.   
  11. public class SpinnerDemoActivity extends Activity {  
  12.     // 省略City部分Spinner和ArrayAdapter聲明的代碼  
  13.     private Spinner age = null;// 聲明一個Spinner組件,表示年齡  
  14.     private ArrayAdapter<CharSequence> ages = null;// 聲明一個ArrayAdapter來適配年齡  
  15.     private List<CharSequence> age_data = null;// 聲明一個放置年齡數據的List  
  16.     public void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         super.setContentView(R.layout.main);  
  19.         // 省略City部分的設置代碼  
  20.         age = new Spinner(this);// 創建Spinner對象  
  21.         age.setPrompt("您的年齡段是:");// 設置Prompt  
  22.         age_data = Arrays.asList(new CharSequence[] { "10歲以下""10-20歲",  
  23.                 "20-30歲""30-40歲""40-50歲""50-60歲""60歲以上" });// 設置年齡段數組並最終轉換爲List類型  
  24.         ages = new ArrayAdapter<CharSequence>(this,  
  25.                 android.R.layout.simple_spinner_item, age_data);// 實例化ArrayAdapter  
  26.     ages.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);// 設置列表項顯示風格  
  27.         age.setAdapter(ages);// 設置顯示信息  
  28.         LinearLayout layout = (LinearLayout) super.findViewById(R.id.layout);  
  29.         TextView ageLabel=new TextView(this);  
  30.         ageLabel.setText("請選擇您的年齡段");  
  31.         layout.addView(ageLabel);  
  32.         layout.addView(age);  
  33.     }  
  34. }  

    在此之前,不要忘了在main.xml中爲我們的佈局管理器加上ID屬性,這樣才能在程序中進行調用,運行程序,我們可以看到如下效果: 
 
    點擊即可彈出下拉列表框顯示具體內容了。 
    下面我們在Android設備上來運行Spinner的示例程序,運行環境爲Motorola Defy+ 2.3.7 MIUI,所得到的具體顯示效果爲: 
 
    可以看出,這和我們在模擬器中的顯示效果略有不同,那麼就是手機所刷ROM對我們組件顯示風格的影響了,也就是說,在不同的ROM下,會有不同的顯示效果。 
    本部分代碼請參考附件。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章