android Spinner控制項詳解

來源:互聯網
上載者:User

標籤:

Spinner提供了從一個資料集合中快速選擇一項值的辦法。預設情況下Spinner顯示的是當前選擇的值,點擊Spinner會彈出一個包含所有可選值的dropdown菜單,從該菜單中可以為Spinner選擇一個新值。

顯示的是Spinner常見的樣式。這篇文章中我將討論1.Spinner的基本用法 2.設定Spinner的Adapter (arrayadapter 和自訂BaseAdapter)3.Spinner的菜單顯示方式 4.Spinner的xml屬性

最簡單的Spinner

在布局檔案中添加Spinner控制項

 <LinearLayout         android:layout_width="fill_parent"        android:layout_height="fill_parent"        android:orientation="vertical" >        <Spinner            android:id="@+id/spinner1"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:entries="@array/languages"          />    </LinearLayout>

其中android:entries=”@array/languages”表示Spinner的資料集合是從資源數組languages中擷取的,languages數組資源定義在values/arrays.xml中:

<?xml version="1.0" encoding="utf-8"?><resources>    <string-array name="languages">        <item>c語言</item>        <item>java </item>        <item>php</item>        <item>xml</item>        <item>html</item>    </string-array></resources>

如果你不需要對Spinner的選擇事件做響應,那麼一個完整的Spinner使用流程就結束了。

運行結果:

當然,一般情況下我們是需要響應Spinner選擇事件的,可以通過OnItemSelectedListener的回調方法實現

public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Spinner spinner = (Spinner) findViewById(R.id.spinner1);        spinner.setOnItemSelectedListener(new OnItemSelectedListener() {            @Override            public void onItemSelected(AdapterView<?> parent, View view,                     int pos, long id) {                String[] languages = getResources().getStringArray(R.array.languages);                Toast.makeText(MainActivity.this, "你點擊的是:"+languages[pos], 2000).show();            }            @Override            public void onNothingSelected(AdapterView<?> parent) {                // Another interface callback            }        });    }}

上面的Spinner看起來非常漂亮,不過它並不是總是如此,剛剛看到的是在android:Theme.Holo.Light主題下的效果,同樣的代碼如果在android:Theme.Light下面就會變得很醜。

想必這也是很多人不想使用Spinner的原因了吧。如果想相容2.3,則只能忍受這樣的效果。

設定Spinner的Adapter
上面使用Spinner資料來源於xml數組,其實用的最多的還是通過adapter來跟Spinner綁定資料。

使用ArrayAdapter

// 初始化控制項Spinner spinner = (Spinner) findViewById(R.id.spinner1);// 建立資料來源String[] mItems = getResources().getStringArray(R.array.languages);// 建立Adapter並且綁定資料來源ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, mItems);adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);//綁定 Adapter到控制項spinner .setAdapter(adapter);spinner.setOnItemSelectedListener(new OnItemSelectedListener() {    @Override    public void onItemSelected(AdapterView<?> parent, View view,             int pos, long id) {        String[] languages = getResources().getStringArray(R.array.languages);        Toast.makeText(MainActivity.this, "你點擊的是:"+languages[pos], 2000).show();    }    @Override    public void onNothingSelected(AdapterView<?> parent) {        // Another interface callback    }});

這是Spinner的標準使用方法,其中,有兩行代碼可以決定Spinner的外觀:

ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, mItems);

第二個參數是Spinner未展開菜單時Spinner的預設樣式,android.R.layout.simple_spinner_item是系統內建的內建布局。

2

adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

設定的是展開的時候下拉式功能表的樣式(注意和上面區別),同理android.R.layout.simple_spinner_dropdown_item也是內建布局。

如果不設定adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)會怎樣呢?

會造成未展開的sipnner和展開的菜單都是一種配置樣式。下面一運行來說明:

沒有adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item):

有setDropDownViewResource:

你可能會很好奇如果設定了setDropDownViewResource但是setDropDownViewResource的參數和ArrayAdapter的第二個布局參數(simple_spinner_item)一致的情況下會怎樣。情況是和沒有setDropDownViewResource是一樣的,因為上面說了不設定setDropDownViewResource Spinner未展開和展開都是用的一樣的布局。

其實simple_spinner_item和simple_spinner_dropdown_item兩者的名字正好反映了他們的區別。一個應用於下拉一個應用於Spinner本身。

使用自訂的BaseAdapter

這種情況適用於spinner比較複雜的情況,比如帶有表徵圖。

下面我們定義一個選擇連絡人的Spinner。

 <LinearLayout         android:layout_width="fill_parent"        android:layout_height="80dip"        android:orientation="vertical" >        <Spinner            android:id="@+id/spinner2"            android:layout_width="wrap_content"            android:layout_height="wrap_content"          />    </LinearLayout>

activity中:

    // 初始化控制項        Spinner spinner2  = (Spinner) findViewById(R.id.spinner2);        // 建立資料來源        List<Person>  persons=new ArrayList<Person>();        persons.add(new Person("張三", "上海 "));        persons.add(new Person("李四", "上海 "));        persons.add(new Person("王五", "北京" ));        persons.add(new Person("趙六", "廣州 "));        //  建立Adapter綁定資料來源        MyAdapter _MyAdapter=new MyAdapter(this, persons);        //綁定Adapter        spinner2.setAdapter(_MyAdapter);

Person.java

package com.example.spinnerdemo;public class Person {    private String personName;    private String personAddress;    public Person(String personName, String personAddress) {        super();        this.personName = personName;        this.personAddress = personAddress;    }    public String getPersonName() {        return personName;    }    public void setPersonName(String personName) {        this.personName = personName;    }    public String getPersonAddress() {        return personAddress;    }    public void setPersonAddress(String personAddress) {        this.personAddress = personAddress;    }}

MyAdapter.java

package com.example.spinnerdemo;import java.util.List;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;/** * 自訂配接器類 * @author jiangqq  <a href=http://blog.csdn.net/jiangqq781931404></a> * */public class MyAdapter extends BaseAdapter {    private List<Person> mList;    private Context mContext;    public MyAdapter(Context pContext, List<Person> pList) {        this.mContext = pContext;        this.mList = pList;    }    @Override    public int getCount() {        return mList.size();    }    @Override    public Object getItem(int position) {        return mList.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    /**     * 下面是重要代碼     */    @Override    public View getView(int position, View convertView, ViewGroup parent) {        LayoutInflater _LayoutInflater=LayoutInflater.from(mContext);        convertView=_LayoutInflater.inflate(R.layout.item_custom, null);        if(convertView!=null) {            ImageView imageView = (ImageView)convertView.findViewById(R.id.image);            imageView.setImageResource(R.drawable.ic_launcher);            TextView _TextView1=(TextView)convertView.findViewById(R.id.textView1);            TextView _TextView2=(TextView)convertView.findViewById(R.id.textView2);            _TextView1.setText(mList.get(position).getPersonName());            _TextView2.setText(mList.get(position).getPersonAddress());        }        return convertView;    }}

運行效果:

Spinner的菜單顯示方式

它有兩種顯示形式,一種是下拉式功能表,一種是彈出框,菜單顯示形式是spinnerMode屬性決定的:

android:spinnerMode="dropdown"android:spinnerMode="dialog"

在android2.3上沒有這個屬性,系統預設將Spinner快顯功能表顯示成dialog。下面是Theme.Light和Theme.Holo.Light下Spinner在不同模式下的效果對比圖。

Spinner的xml屬性

其實上面已經提到了Spinner的兩個屬性:

1 entries: 直接在xml布局檔案中綁定資料來源(可以不設定,即可以在Activity中動態綁定)

2 spinnerMode: Spinner的顯示形式

除此之外還有如下屬性:

prompt:在Spinner彈出選擇對話方塊的時候對話方塊的標題:

屬性名稱

android:dropDownHorizontalOffset

對應方法:

setDropDownHorizontalOffset(int)

spinnerMode=”dropdown”時,下拉的項目選擇視窗在水平方向相對於Spinner視窗的位移量。

它必須是一個帶有單位的浮點型尺寸值,如:”14.5sp”。有效單位包括:px(像素)、dp(密度無關的像素)、sp(基於引用字型的尺寸來縮放的像素)、in(英寸)、mm(毫米)。

這個屬性還可以引用一個資源(格式:@[package:]type:name)或者是包含這種類型值的主題屬性(格式:?[package][type:]name)。

這個屬性對應全域屬性資源符號dropDownHorizontalOffset。

android:dropDownSelector

用於設定spinnerMode=”dropdown”時列表選取器的顯示效果。

它可以用”@[+][package]:type:name”格式來引用另外的資源,或者是用”?[package:][type:]name”的格式來 應用主題屬性,還可以是”#rgb”、”#argb”、”#rrggbb”、”aarrggbb”格式的顏色值。

它對應的全域屬性資源符號是dropDownSelector。

android:dropDownVerticalOffset

對應方法:

setDropDownVerticalOffset(int)

spinnerMode=”dropdown”時,下拉的項目選擇視窗在垂直方向相對於Spinner視窗的位移量。

這個屬性它必須是一個帶有單位的浮點型尺寸值,如:”14.5sp”。有效單位包括:px(像素)、dp(密度無關的像素)、sp(基於引用字型的尺寸來縮放的像素)、in(英寸)、mm(毫米)。

還可以引用一個資源(格式:@[package:]type:name)或者是包含這種類型值的主題屬性(格式:?[package][type:]name)。

這個屬性對應全域屬性資源符號dropDownVerticalOffset。

android:dropDownWidth

對應方法:

setDropDownWidth(int)

在spinnerMode=”dropdown”時,設定下拉框的寬度。

這個屬性可以是帶有單位的浮點型的尺寸值,如:14.5sp。有效單位包括:px(像素)、dp(密度無關的像素)、sp(基於引用字型的尺寸來縮放的像素)、in(英寸)、mm(毫米)。

還可以引用一個資源(格式:@[package:]type:name)或者是包含這種類型值的主題屬性(格式:?[package][type:]name)。

還可以是下列常量之一:

fill_parent = -1,下拉框的寬度應該使用螢幕的寬度來設定。這個常量從API Level 8開始被廢棄了,並且使用mach_parent常量來代替。

mach_parent = -1,下拉框的寬度應該使用螢幕的寬度來設定。在API Level 8中被引入。

wrap_content = -2,下拉框的寬度應該跟它的內容相適應。

它對應的全域資源符號是dropDownWidth。

android:gravity

對應方法:

1
setGravity(int)
這個屬性用於設定當前選擇的項目的對齊。

它必須是以下常量值之一或組合(用”|”符號分離)。

top = 0x30:把選擇的對象放到它的容器的頂部,不改變它的尺寸。

bottom = 0x50:把選擇的對象放到它的容器的底部,不改變它的尺寸。

left = 0x03:把選擇的對象放到它的容器的左邊,不改變它的尺寸。

right = 0x05:把選擇的對象放到它的容器的右邊,不改變它的尺寸。

center_vertical = 0x10:把選擇的對象放到它的容器的垂直中心,不改變它的尺寸。

fill_vertical = 0x70:為了完全的填充它的容器,系統會根據需要來增加選擇對象的垂直尺寸。

center_horizontal = 0x01:把選擇的對象放到它的容器的水平中心,不改變它的尺寸。

fill_horizontal = 0x07:為了完全的填充它的容器,系統會根據需要來增加選擇對象的水平尺寸。

center = 0x11:把選擇的對象放到它的容器的垂直和水平中心,不改變它的尺寸。

fill = 0x77:為了完全的填充它的容器,系統會根據需要來增加選擇對象的水平和垂直尺寸。

clip_vertical = 0x80:附加的可選設定,它可以設定容器內子物件的上下邊緣裁剪它的容器邊框。裁剪會基於垂直對齊的方式:頂部對齊的會裁剪底部邊緣,底部對齊的會裁剪頂部邊緣,不會上下邊緣都裁剪。

clip_horizontal = 0x08:附加的可選設定,它可以設定容器內子物件的左右邊緣裁剪它的容器邊框。裁剪會基於水平對齊的方式:靠左對齊的會裁剪右邊緣,靠右對齊的會裁剪左邊緣,不會左右邊緣都裁剪。

start = 0x00800003:把對象放到它的容器的開始位置,不改變它的尺寸。

end = 0x00800005:把對象放到它的容器的結束位置,不改變它的尺寸。

對應的全域屬性資源符號是gravity。

註:Spinner對象是一個視窗對象容器,設定它的gravity屬性時,只會改變容器內部子視窗對象的對齊,並不會改變子視窗內部內容的對齊。

android:popupBackground

對應方法:

1
setPopupBackgroundResource(int)
在spinner=”dropdown”時,使用這個屬性來設定下拉式清單的背景。

可以使用”@[+][package:]type:name”格式來引用另外的資源,或者使用”?[package:][type:]name”格式來應 用主題屬性,也可以使用”#rgb”、”#argb”、”#rrggbb”、”#aarrggbb”格式的顏色值。

對應的全域屬性資源符號是popupBackground

喜歡的話就給我買個棒冰

android Spinner控制項詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.