Android程序的基本控件使用之7下拉列表Spinner
7下拉列表Spinner
掌握下拉列表Spinner的使用;
可以通过程序配置下拉列表Spinner显示内容;
可以通过配置文件配置下拉列表Spinner显示内容。
通过本程序就应该可以发现,下拉列表Spinner的核心问题就是在于下拉数据内容的显示上。
内容:
下拉列表框也是一种常见的图形组件,它可以为用户提供列表的选则方式,与复选框或单选钮相比可以节省手机的屏幕空间,在Android中可以使用Android.widget.Spinner类实现,此类定义如下:
java.lang.Object
↳ android.view.View
↳ android.view.ViewGroup
↳ android.widget.AdapterView
↳ android.widget.AbsSpinner
↳ android.widget.Spinner
由于spinner的核心问题在于内容的设置上,所以所讲解的操作方法也是与设置内容有关。
在spinner类中的setAdapter()方法,表示的是设置下拉列表框中的显示内容。
SpinnerAdapter的功能就是一个适配器,会将所需要的数据进行包装并放在Spinner之中。
既然现在对于Spinner的核心问题在于内容的配置上,所以这里面就需要通过以下的方式设置内容。
在Android中,可以直接在main.xml文件中定义“
方式一:直接通过资源文件配置;
方式二:通过android.widget.ArrayAdapter类读取资源文件或者是指定具体设置的数据;
配置Spinner:
xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Hello World, MySpinnerDemo" /> android:id="@+id/mycity" android:layout_width="fill_parent" android:layout_height="wrap_content">
|
对于Spinner的内容可以直接在values文件夹之中定义若干个资源文件,例如,以上如果要定义一个表示城市信息的下拉选项,就可以定义一个city_data.xml定义。
范例:定义文件city_data.xml
|
此处就表示配置了一个下拉的选项,如果要想配置这个选项,则可以直接通过<Spinner>节点:
android:id="@+id/mycity" android:layout_width="fill_parent" android:layout_height="wrap_content" android:entries="@array/city_labels"> 配置所有下拉列表框中的显示内容,而此内容是通过city_data.xml文件之中加载过来的。
|
范例:配置下拉列表框中的prompt提示信息
|
如果要想使用此信息,就继续修改
android:id="@+id/mycity" android:prompt="@string/city_prompt" 加入提示信息 android:layout_width="fill_parent" android:layout_height="wrap_content" android:entries="@array/city_labels">
|
此时就已经出现了提示的操作信息。
方式二:通过android.widget.ArrayAdapter类
ArrayAdapter类的功能:有两个主要功能:读取资源文件中定义的列表项或者是通过List集合设置列表项,此类定义了如下几个常用方法。
即:如果要使用ArrayAdapter配置下拉列表框的内容,可以采用配置文件完成,为了演示以上两种实现形式,下面先采用配置文件读取的方式完成。
范例:定义一个表示颜色的下拉框color_data.xml
|
这个配置文件将在ArrayAdapter类中进行读取,为了使用ArrayAdapter还需要定义一个Spinner:
android:id="@+id/info_color" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="请选择您喜欢的颜色:" /> android:id="@+id/mycolor"
android:layout_width="fill_parent" android:layout_height="wrap_content" >
|
现在的spinner的配置文件里面,不在加入任何的配置信息,只是定义了一个空的下拉列表框。而在随后的activity程序之中,要动态的进行配置。
在封装之前肯定要使用ArrayAdapter
方法: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; //表示要读取的颜色列表框 private ArrayAdapter @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("请选择您喜欢的颜色:"); this.adapterColor = ArrayAdapter.createFromResource(this, R.array.color_labels,android.R.layout.simple_spinner_item);//实例化了ArrayAdapter this.spiColor.setAdapter(this.adapterColor); //设置显示信息
} } |
本操作与之前直接配置没有任何的区别,效果是一样的,只不过代码稍微多了一点。
但是现在感觉这个的显示很难看,有没有稍微好看一点的,
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; //表示要读取的颜色列表框 private ArrayAdapter @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("请选择您喜欢的颜色:"); 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的另外一种形式。
android:id="@+id/info_edu" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="请选择您的学历:" /> android:id="@+id/myedu"
android:layout_width="fill_parent" android:layout_height="wrap_content" >
|
此时也配置了一个新的Spinner,只不过这个时候不再需要任何的资源文件了,都是通过程序代码生成的列表内容。
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; //表示要读取的颜色列表框 private Spinner spiEdu = null ; //定义下拉列表 private ArrayAdapter private ArrayAdapter private List @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("请选择您喜欢的颜色:"); 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 this.dataEdu.add("大学"); this.dataEdu.add("研究生"); this.dataEdu.add("高中");
this.spiEdu = (Spinner) super.findViewById(R.id.myedu) ; //取得下拉框 this.spiEdu.setPrompt("请选择您喜欢的学历:"); this.adapterEdu = new ArrayAdapter android.R.layout.simple_spinner_item,this.dataEdu) ;//准备好下拉列表框的内容 this.adapterEdu. setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); //换个风格 this.spiEdu.setAdapter(this.adapterEdu); } } |
有一个默认的Spinner的显示,以及打开之后的显示操作。
这个下拉列表框的实现要远比之前讲解的各个组件困难许多,大部分的情况下都是利用资源文件的方式配置的。
如果有些时候要动态的配置下拉内容的话,就必须理解以上的程序做法了。
总结:
使用spinner可以完成下拉列框的显示功能;
下拉列框的显示内容可以通过配置文件或程序进行填充;
提示:如果对于集合框架不熟悉的读者,一定要好好先复习一次,包括各个的核心接口和核心类的特点及使用。