Android程序的基?件使用之7下拉列表Spinner
7下拉列表Spinner
掌握下拉列表Spinner的使?
?通过程序配置下拉列表Spinner显示内??/span>
?通过配置文件配置下拉列表Spinner显示内??/span>
通过?序就应??发现,下拉列?/span>Spinner的核心问题就?于下拉数?容的显示上??/span>
内??/span>
下拉列表框也?种常见的图形组件,它?为用户提供列表的选则方式,与复??或单选钮相比?节省手机的屏幕空间,?/span>Android?以使?/span>Android.widget.Spinner类实现,此类定义如下?/span>
java.lang.Object
?/span> android.view.View
?/span> android.view.ViewGroup
?/span> android.widget.AdapterView<T extends android.widget.Adapter>
?/span> android.widget.AbsSpinner
?/span> android.widget.Spinner
由于spinner的核心问题在于内容的设置上,?以所讲解的操作方法也?设置内?有关?/span>
?/span>spinner类中?/span>setAdapter()方法,表示的???拉列表??显示内??/span>
SpinnerAdapter的功能就???配?会将??要的数据进?包?并放?/span>Spinner之中?/span>
既然现在对于Spinner的核心问题在于内容的配置上,?以这里面就需要?过以下的方式??容??/span>
?/span>Android??直接?/span>main.xml文件?义??/span><Spinner>”节点,但是在定义?元素的时候却不能直接设置其显示的列表项,关于下拉列表框中的列表项有以下两种方式进行配?
方式?:直接?过资源文件配置?/span>
方式二:通过android.widget.ArrayAdapter类?取资源文件或者是指定具体设置的数?
配置Spinner?/span>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Hello World, MySpinnerDemo" /> <Spinner android:id="@+id/mycity" android:layout_width="fill_parent" android:layout_height="wrap_content">
</Spinner> </LinearLayout>
|
对于Spinner的内容可以直接在values文件?/span>之中定义若干?源文件,例?,以上?果?定义??示城市信?下拉选项,就?定义??/span>city_data.xml定义?/span>
范例:定义文?/span>city_data.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="city_labels"> <item>北京</item> <item>上海</item> <item>南京</item> </string-array> </resources> |
此?就表示配???拉的选项,?果?想配???项,则?直接通过<Spinner>节点?/span>
<Spinner android:id="@+id/mycity" android:layout_width="fill_parent" android:layout_height="wrap_content" android:entries="@array/city_labels"> 配置?有下拉列表??显示内?,??内???过city_data.xml文件之中加载过来的??/span>
</Spinner> |
范例:配?拉列表??prompt提示信息
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">下拉列表</string> <string name="city_prompt">请?择您喜欢的城市?/span></string> </resources> |
如果要想使用此信?就继??/span><Spinner>属???/span>
<Spinner android:id="@+id/mycity" android:prompt="@string/city_prompt" 加入提示信息 android:layout_width="fill_parent" android:layout_height="wrap_content" android:entries="@array/city_labels">
</Spinner> |
此时就已经出现了提示的操作信???/span>
方式二:通过android.widget.ArrayAdapter?/span>
ArrayAdapter类的功能:有两个主?功能:?取资源文件中定义的列表项或?是通过List集合设置列表项,此类定义了?下几?用方法??/span>
即:如果要使?/span>ArrayAdapter配置下拉列表框的内?,可以采用配?件完成,为了演示以上两?实现形式,下面先采用配置文件读取的方式完成??/span>
范例:定义一?示?色的下拉?/span>color_data.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="color_labels"> 表示颜色集合的标?/span> <item>红色</item> <item>绿色</item> <item>蓝色</item> </string-array> </resources> |
这个配置文件将在ArrayAdapter类中进?读取,为了使?/span>ArrayAdapter还需要定义一?/span>Spinner:
<TextView android:id="@+id/info_color" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="请?择您喜欢的颜色?/span>" /> <Spinner android:id="@+id/mycolor"
android:layout_width="fill_parent" android:layout_height="wrap_content" >
</Spinner> |
现在?/span>spinner的配?件里?不在加入任何的配???定义了一?的下拉列表?。?在随后?/span>activity程序之中,?动?的进?配置?/span>
在封装之前肯定?使用ArrayAdapter
方法?/span>public static ArrayAdapter<CharSequence> ceateFromResource (Context context, int textArrayResId, int textViewResId)
(上下文?象,文本的数组的资源ID,文?显示风格)
package com.example.SpinnerProject;
import android.app.Activity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.Spinner;
public class MySpinnerDemo extends Activity { private Spinner spiColor = null; //表示要?取的颜色列表?/span> private ArrayAdapter<CharSequence> adapterColor = null ; //?有的数据类型都是String @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.main); this.spiColor = (Spinner) super.findViewById(R.id.mycolor); //取得颜色的下拉列表? this.spiColor.setPrompt("请?择您喜欢的颜色?/span>"); this.adapterColor = ArrayAdapter.createFromResource(this, R.array.color_labels,android.R.layout.simple_spinner_item);//实例化了ArrayAdapter this.spiColor.setAdapter(this.adapterColor); //设置显示信息
} } |
?作与之前直接配置没有任何的区?效果?样的,只不过代码稍微多了?点??/span>
但是现在感?这个的显示很难看,有没有稍微好看?点的?/span>
package com.example.SpinnerProject;
import android.app.Activity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.Spinner;
public class MySpinnerDemo extends Activity { private Spinner spiColor = null; //表示要?取的颜色列表?/span> private ArrayAdapter<CharSequence> adapterColor = null ; //?有的数据类型都是String @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.main); this.spiColor = (Spinner) super.findViewById(R.id.mycolor); //取得颜色的下拉列表? this.spiColor.setPrompt("请?择您喜欢的颜色?/span>"); this.adapterColor = ArrayAdapter.createFromResource(this, R.array.color_labels,android.R.layout.simple_spinner_item);//实例化了ArrayAdapter this.adapterColor. setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); //?风格 this.spiColor.setAdapter(this.adapterColor); //设置显示信息
} } |
?对于ArrayAdapter而言,除了?取资源文件之外,还可能需要?过程序动?生成,?以现在就?使用ArrayAdapter的另外一种形式??/span>
<TextView android:id="@+id/info_edu" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="请?择您的学历?/span>" /> <Spinner android:id="@+id/myedu"
android:layout_width="fill_parent" android:layout_height="wrap_content" >
</Spinner> |
此时也配????/span>Spinner,?过这?候不再需要任何的资源文件了,都是通过程序代码生成的列表内容??/span>
package com.example.SpinnerProject;
import android.app.Activity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.Spinner;
import java.util.ArrayList; import java.util.List;
public class MySpinnerDemo extends Activity { private Spinner spiColor = null; //表示要?取的颜色列表?/span> private Spinner spiEdu = null ; //定义下拉列表 private ArrayAdapter<CharSequence> adapterColor = null ; //?有的数据类型都是String private ArrayAdapter<CharSequence> adapterEdu = null ; //?有的数据??符串 private List<CharSequence> dataEdu = null ; //定义??合数?/span> @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.main); this.spiColor = (Spinner) super.findViewById(R.id.mycolor); //取得颜色的下拉列表?
this.spiColor.setPrompt("请?择您喜欢的颜色?/span>"); this.adapterColor = ArrayAdapter.createFromResource(this, R.array.color_labels,android.R.layout.simple_spinner_item);//实例化了ArrayAdapter this.adapterColor. setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); //?风格 this.spiColor.setAdapter(this.adapterColor); //设置显示信息
//配置List集合包?的下拉?内? this.dataEdu = new ArrayList<CharSequence>(); this.dataEdu.add("大?"); this.dataEdu.add("研究?/span>"); this.dataEdu.add("高中");
this.spiEdu = (Spinner) super.findViewById(R.id.myedu) ; //取得下拉?/span> this.spiEdu.setPrompt("请?择您喜欢的学历?/span>"); this.adapterEdu = new ArrayAdapter<CharSequence>(this, android.R.layout.simple_spinner_item,this.dataEdu) ;//准?好下拉列表?的内?/span> this.adapterEdu. setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); //?风格 this.spiEdu.setAdapter(this.adapterEdu); } } |
有一?认的Spinner的显示,以及打开之后的显示操作??/span>
这个下拉列表框的实现要远比之前?解的各个组件困难许?,大部分的情况下都是利用资源文件的方式配??/span>
如果有些时??动?的配置下拉内?的话,就必须理解以上的程序做法了?/span>
总结?/span>
使用spinner?完成下拉列?的显示功能;
下拉列?的显示内容可以?过配置文件或程序进行填充;
提示:?果?于集合?架不熟悉的?者,?定?好好先?习一次,包括各个的核心接口和核心类的特点及使用??/span>