UI组件之AdapterView及其子类(三)Spinner控件详解
Spinner提供了從一個(gè)數(shù)據(jù)集合中快速選擇一項(xiàng)值的辦法。默認(rèn)情況下Spinner顯示的是當(dāng)前選擇的值,點(diǎn)擊Spinner會(huì)彈出一個(gè)包含所有可選值的dropdown菜單或者一個(gè)dialog對(duì)話框,從該菜單中可以為Spinner選擇一個(gè)新值。
這篇文章中我將討論
1.Spinner的基本用法?
2.Spinner的xml屬性
3.設(shè)置Spinner的Adapter (antries屬性,arrayadapter 和自定義BaseAdapter)?
最簡(jiǎn)單的Sipnner用法是使用spinner的android:antries屬性直接使用arrays數(shù)組資源,顯示一個(gè)下拉列表
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><!-- 這個(gè)spinner由entries提供值 --><Spinnerandroid:id="@+id/spinner1"android:layout_width="match_parent"android:layout_height="wrap_content"android:dropDownWidth="200dp"android:entries="@array/province"android:prompt="@string/promp" /> </LinearLayout>其中android:entries="@array/province"表示Spinner的數(shù)據(jù)集合是從資源數(shù)組 province中獲取的, province數(shù)組資源定義在values/arrays.xml中:
<?xml version="1.0" encoding="utf-8"?> <resources><string-array name="province"><item >湖南省</item><item >湖北省</item><item >北京市</item><item >上海市</item> </string-array></resources>
當(dāng)然,一般情況下我們是需要響應(yīng)Spinner選擇事件的,可以通過(guò)OnItemSelectedListener的回調(diào)方法實(shí)現(xiàn)
public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Spinner spinner = (Spinner) findViewById(R.id.spinner1);spinner.setOnItemSelectedListener(new OnItemSelectedListener() {@Overridepublic void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {String[] languages = getResources().getStringArray(R.array.languages);Toast.makeText(MainActivity.this, "你點(diǎn)擊的是:"+province[pos], 2000).show();}@Overridepublic void onNothingSelected(AdapterView<?> parent) {// Another interface callback}});}}
2.Spinner的xml屬性
、
android:entries: 直接在xml布局文件中綁定數(shù)據(jù)源(可以不設(shè)置,即可以在Activity中動(dòng)態(tài)綁定)
android:prompt:在Spinner彈出選擇對(duì)話框(?android:prompt="西游記人物")的時(shí)候?qū)υ捒虻臉?biāo)題:
android:spinnerMode: Spinner的顯示形式,它的值只有“dialog”和“dropdown”兩種,對(duì)話框和下拉列表的形式
android:dropDownHorizontalOffset(setDropDownHorizontalOffset(int)):spinnerMode=”dropdown”時(shí),下拉的項(xiàng)目選擇窗口在水平方向相對(duì)于Spinner窗口的偏移量
android:dropDownVerticalOffset(setDropDownVerticalOffset(int)):spinnerMode=”dropdown”時(shí),下拉的項(xiàng)目選擇窗口在垂直方向相對(duì)于Spinner窗口的偏移量。還可以引用一個(gè)資源(格式:@[package:]type:name)或者是包含這種類型值的主題屬性
android:dropDownSelector:用于設(shè)定spinnerMode=”dropdown”時(shí)列表選擇器的顯示效果。它可以用”@[+][package]:type:name”格式來(lái)引用另外的資源,或者是用”?[package:][type:]name”的格式來(lái) 應(yīng)用主題屬性,還可是”#rgb”、”#argb”、”#rrggbb”、”aarrggbb”格式的顏色值
android:dropDownWidth:在spinnerMode=”dropdown”時(shí),設(shè)定下拉框的寬度。
這個(gè)屬性可以是帶有單位的浮點(diǎn)型的尺寸值,如:14.5sp。有效的單位包括:px(像素)、dp(密度無(wú)關(guān)的像素)、sp(基于引用字體的尺寸來(lái)縮放的像素)、in(英寸)、mm(毫米)
還可以是下列常量之一:
fill_parent = -1,下拉框的寬度應(yīng)該使用屏幕的寬度來(lái)設(shè)定。這個(gè)常量從API Level 8開(kāi)始被廢棄了,并且使用mach_parent常量來(lái)代替。
mach_parent = -1,下拉框的寬度應(yīng)該使用屏幕的寬度來(lái)設(shè)定。在API Level 8中被引入。
wrap_content = -2,下拉框的寬度應(yīng)該跟它的內(nèi)容相適應(yīng)。
android:gravity:這個(gè)屬性用于設(shè)置當(dāng)前選擇的項(xiàng)目的對(duì)齊方式。
android:popupBackground:在spinner=”dropdown”時(shí),使用這個(gè)屬性來(lái)設(shè)置下拉列表的背景。可以使用”@[+][package:]type:name”格式來(lái)引用另外的資源,或者使用”?[package:][type:]name”格式來(lái)應(yīng) 用主題屬性,也可以使用”#rgb”、”#argb”、”#rrggbb”、”#aarrggbb”格式的顏色值。
3,Arrayadapter 設(shè)置Spinner的的適配器,提供列表項(xiàng)
下面提供兩個(gè)Spinner,第一個(gè)使用“下拉列表”,android:entries屬性提供數(shù)組,第二個(gè)使用“dialog”形式,使用ArrayAdapter提供適配器
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><!-- 這個(gè)spinner由entries提供值 --><Spinnerandroid:id="@+id/spinner1"android:layout_width="match_parent"android:layout_height="wrap_content"android:dropDownWidth="200dp"android:entries="@array/province"/><!-- 這個(gè)Spinner有adapter提供值 ,android:spinnerMode="dialog"下拉列表是以對(duì)話框的形式--><Spinnerandroid:id="@+id/spinner2"android:layout_width="match_parent"android:layout_height="wrap_content"android:popupBackground="#f00"android:spinnerMode="dialog"android:prompt="@string/promp" /></LinearLayout>MainActivity.java
public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//獲取spinner布局文件中的Spinner組件Spinner sp=(Spinner) findViewById(R.id.spinner2);String[] arr={"唐僧","孫悟空","豬八戒","沙和尚"};//創(chuàng)建adapter對(duì)象ArrayAdapter<String> aa=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,arr);sp.setAdapter(aa);}
這是Spinner的標(biāo)準(zhǔn)使用方法,其中,有兩行代碼可以決定Spinner的外觀:
ArrayAdapter<String> aa=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,arr);第二個(gè)參數(shù)是Spinner未展開(kāi)菜單時(shí)Spinner的默認(rèn)樣式,android.R.layout.simple_spinner_item是系統(tǒng)自帶的內(nèi)置布局。
4,自定義Adapter創(chuàng)建Spinner
這種情況適用于spinner比較復(fù)雜的情況,比如帶有圖標(biāo)。
下面我們定義一個(gè)選擇聯(lián)系人的Spinner。
main.xml
<LinearLayout android:layout_width="fill_parent"android:layout_height="80dip"android:orientation="vertical" ><Spinnerandroid:id="@+id/spinner2"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout>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;}@Overridepublic int getCount() {return mList.size();}@Overridepublic Object getItem(int position) {return mList.get(position);}@Overridepublic long getItemId(int position) {return position;}/*** 下面是重要代碼,每一項(xiàng)的布局是兩個(gè)文本框,當(dāng)然也可以加其他組件,這個(gè)就很豐富了*/@Overridepublic 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;} }MainActivity.java
// 初始化控件Spinner spinner2 = (Spinner) findViewById(R.id.spinner2);// 建立數(shù)據(jù)源List<Person> persons=new ArrayList<Person>();persons.add(new Person("張三", "上海 "));persons.add(new Person("李四", "上海 "));persons.add(new Person("王五", "北京" ));persons.add(new Person("趙六", "廣州 "));// 建立Adapter綁定數(shù)據(jù)源MyAdapter _MyAdapter=new MyAdapter(this, persons);//綁定Adapterspinner2.setAdapter(_MyAdapter);
總結(jié)
以上是生活随笔為你收集整理的UI组件之AdapterView及其子类(三)Spinner控件详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: UI组件之AdapterView及其子类
- 下一篇: UI组件之AdapterView及其子类