Android学习笔记九:基本视图组件:Spinner
2014-09-02 19:35
351 查看
在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代码
<TextView
android:id="@+id/degreeLabel"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="请选择您的学历" />
<Spinner
android:id="@+id/degree"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
这里放置了一个空的Spinner,直接运行程序,我们看到如下效果:
就是一个空的下拉框,什么都没有,下面我们开始向这个下拉框中设置列表项。首先我们使用XML资源文件的配置方式,在values目录下创建spinner_data.xml,并设置如下内容:
Xml代码
<string-array name="degrees">
<item>初中及以下</item>
<item>高中</item>
<item>大学</item>
<item>研究生及以上</item>
</string-array>
不难理解<string-array>表示字符串的数组,就是可以定义多个字符串的项目,在其中,我们仍然使用<item>来定义每一项,设置好后,将其应用到Spinner中:
Xml代码
<Spinner
android:id="@+id/degree"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:entries="@array/degrees" />
配置Spinner组件中的entries属性即可引用我们在spinner_data.xml中定义的degrees项目组了,不难想到,它已经被注册到R.java中了。运行程序,我们得到如下显示效果:
这里可以看到,我们虽然设置了提示信息,但是点击下拉框后并没有出现Spinner的提示,而是直接显示出了我们设置的选项,这样的显示并不是很好看,我们希望在弹出的Spinner选择框上也给出提示,那么我们可以这么来设置:
Xml代码
<Spinner
android:id="@+id/degree"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:entries="@array/degrees"
android:prompt="@string/degrees_prompt" />
也就是在Spinner组件中加上prompt属性即可,注意这里不能直接使用文本了,而需要使用引用,那么我们在strings.xml中加入如下信息:
Xml代码
<string name="degrees_prompt">您的学历是:</string>
我们再次运行程序,就可以看到如下的效果:
这次再点击Spinner,弹出的下拉框中就有了提示的prompt,显示效果好了很多。
下面我们看看如何通过程序来控制Spinner和列表项,之前说过要使用程序,就要用到Adapter类,这里我们使用实现类ArrayAdapter来进行操作。首先我们使用ArrayAdapter读取XML配置文件的方式来说明:
Xml代码
<string-array name="cities">
<item>北京</item>
<item>上海</item>
<item>大连</item>
</string-array>
我们在spinner_data.xml中再设置一组值来表示城市,有了列表项,我们还需要再创建一个Spinner,那么在main.xml中,再设置一个Spinner:
Xml代码
<TextView
android:id="@+id/cityLabel"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="请选择您所在的城市" />
<Spinner
android:id="@+id/city"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
那么在Activity程序中,我们可以如下来编写代码:
Java代码
package org.ourpioneer;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
public class SpinnerDemoActivity extends Activity {
private Spinner city = null;// 要读取的下拉列表
private ArrayAdapter<CharSequence> cities = null;// 要使用的Adapter
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
city = (Spinner) super.findViewById(R.id.city);// 获取下拉列表
city.setPrompt("您所在的城市是:");// 设置Prompt
cities = ArrayAdapter.createFromResource(this, R.array.cities,android.R.layout.simple_spinner_item);// 实例化ArrayAdapter
city.setAdapter(cities);// 设置显示信息
}
}
根据代码中的注释,不难理解每行代码的意思,这和在XML中配置Spinner是类似的。要多说的一点就是这里我们为ArrayAdapter设置的泛型是CharSequence,而不是直接使用String,这是出于以后对StringBuffer的兼容,来看下CharSequence的文档:
不难看出,String和StringBuffer都是CharSequence的子类,这里定义为CharSequence后直接使用字符串格式是没有问题的。
下面直接运行程序,我们可以看到如下效果:
此时列表项的显示和之前的不同,是因为我们在实例化ArrayAdapter时使用了android.R.layout.simple_spinner_item,也就是使用了简单的spinner项。
可以通过如下的代码控制显示风格:
Java代码
cities.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);// 设置列表项的显示风格
之后再次运行代码,就可以看到和之前一样的显示效果了。
下面来看第二种ArrayAdapter的使用方式,就是在程序中动态生成结果来进行填充,我们修改上面的代码,最终为:
Java代码
package org.ourpioneer;
import java.util.Arrays;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
public class SpinnerDemoActivity extends Activity {
// 省略City部分Spinner和ArrayAdapter声明的代码
private Spinner age = null;// 声明一个Spinner组件,表示年龄
private ArrayAdapter<CharSequence> ages = null;// 声明一个ArrayAdapter来适配年龄
private List<CharSequence> age_data = null;// 声明一个放置年龄数据的List
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
// 省略City部分的设置代码
age = new Spinner(this);// 创建Spinner对象
age.setPrompt("您的年龄段是:");// 设置Prompt
age_data = Arrays.asList(new CharSequence[] { "10岁以下", "10-20岁",
"20-30岁", "30-40岁", "40-50岁", "50-60岁", "60岁以上" });// 设置年龄段数组并最终转换为List类型
ages = new ArrayAdapter<CharSequence>(this,
android.R.layout.simple_spinner_item, age_data);// 实例化ArrayAdapter
ages.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);// 设置列表项显示风格
age.setAdapter(ages);// 设置显示信息
LinearLayout layout = (LinearLayout) super.findViewById(R.id.layout);
TextView ageLabel=new TextView(this);
ageLabel.setText("请选择您的年龄段");
layout.addView(ageLabel);
layout.addView(age);
}
}
在此之前,不要忘了在main.xml中为我们的布局管理器加上ID属性,这样才能在程序中进行调用,运行程序,我们可以看到如下效果:
点击即可弹出下拉列表框显示具体内容了。
下面我们在Android设备上来运行Spinner的示例程序,运行环境为Motorola Defy+ 2.3.7 MIUI,所得到的具体显示效果为:
可以看出,这和我们在模拟器中的显示效果略有不同,那么就是手机所刷ROM对我们组件显示风格的影响了,也就是说,在不同的ROM下,会有不同的显示效果。
首先来看一下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代码
<TextView
android:id="@+id/degreeLabel"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="请选择您的学历" />
<Spinner
android:id="@+id/degree"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
这里放置了一个空的Spinner,直接运行程序,我们看到如下效果:
就是一个空的下拉框,什么都没有,下面我们开始向这个下拉框中设置列表项。首先我们使用XML资源文件的配置方式,在values目录下创建spinner_data.xml,并设置如下内容:
Xml代码
<string-array name="degrees">
<item>初中及以下</item>
<item>高中</item>
<item>大学</item>
<item>研究生及以上</item>
</string-array>
不难理解<string-array>表示字符串的数组,就是可以定义多个字符串的项目,在其中,我们仍然使用<item>来定义每一项,设置好后,将其应用到Spinner中:
Xml代码
<Spinner
android:id="@+id/degree"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:entries="@array/degrees" />
配置Spinner组件中的entries属性即可引用我们在spinner_data.xml中定义的degrees项目组了,不难想到,它已经被注册到R.java中了。运行程序,我们得到如下显示效果:
这里可以看到,我们虽然设置了提示信息,但是点击下拉框后并没有出现Spinner的提示,而是直接显示出了我们设置的选项,这样的显示并不是很好看,我们希望在弹出的Spinner选择框上也给出提示,那么我们可以这么来设置:
Xml代码
<Spinner
android:id="@+id/degree"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:entries="@array/degrees"
android:prompt="@string/degrees_prompt" />
也就是在Spinner组件中加上prompt属性即可,注意这里不能直接使用文本了,而需要使用引用,那么我们在strings.xml中加入如下信息:
Xml代码
<string name="degrees_prompt">您的学历是:</string>
我们再次运行程序,就可以看到如下的效果:
这次再点击Spinner,弹出的下拉框中就有了提示的prompt,显示效果好了很多。
下面我们看看如何通过程序来控制Spinner和列表项,之前说过要使用程序,就要用到Adapter类,这里我们使用实现类ArrayAdapter来进行操作。首先我们使用ArrayAdapter读取XML配置文件的方式来说明:
Xml代码
<string-array name="cities">
<item>北京</item>
<item>上海</item>
<item>大连</item>
</string-array>
我们在spinner_data.xml中再设置一组值来表示城市,有了列表项,我们还需要再创建一个Spinner,那么在main.xml中,再设置一个Spinner:
Xml代码
<TextView
android:id="@+id/cityLabel"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="请选择您所在的城市" />
<Spinner
android:id="@+id/city"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
那么在Activity程序中,我们可以如下来编写代码:
Java代码
package org.ourpioneer;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
public class SpinnerDemoActivity extends Activity {
private Spinner city = null;// 要读取的下拉列表
private ArrayAdapter<CharSequence> cities = null;// 要使用的Adapter
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
city = (Spinner) super.findViewById(R.id.city);// 获取下拉列表
city.setPrompt("您所在的城市是:");// 设置Prompt
cities = ArrayAdapter.createFromResource(this, R.array.cities,android.R.layout.simple_spinner_item);// 实例化ArrayAdapter
city.setAdapter(cities);// 设置显示信息
}
}
根据代码中的注释,不难理解每行代码的意思,这和在XML中配置Spinner是类似的。要多说的一点就是这里我们为ArrayAdapter设置的泛型是CharSequence,而不是直接使用String,这是出于以后对StringBuffer的兼容,来看下CharSequence的文档:
不难看出,String和StringBuffer都是CharSequence的子类,这里定义为CharSequence后直接使用字符串格式是没有问题的。
下面直接运行程序,我们可以看到如下效果:
此时列表项的显示和之前的不同,是因为我们在实例化ArrayAdapter时使用了android.R.layout.simple_spinner_item,也就是使用了简单的spinner项。
可以通过如下的代码控制显示风格:
Java代码
cities.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);// 设置列表项的显示风格
之后再次运行代码,就可以看到和之前一样的显示效果了。
下面来看第二种ArrayAdapter的使用方式,就是在程序中动态生成结果来进行填充,我们修改上面的代码,最终为:
Java代码
package org.ourpioneer;
import java.util.Arrays;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
public class SpinnerDemoActivity extends Activity {
// 省略City部分Spinner和ArrayAdapter声明的代码
private Spinner age = null;// 声明一个Spinner组件,表示年龄
private ArrayAdapter<CharSequence> ages = null;// 声明一个ArrayAdapter来适配年龄
private List<CharSequence> age_data = null;// 声明一个放置年龄数据的List
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
// 省略City部分的设置代码
age = new Spinner(this);// 创建Spinner对象
age.setPrompt("您的年龄段是:");// 设置Prompt
age_data = Arrays.asList(new CharSequence[] { "10岁以下", "10-20岁",
"20-30岁", "30-40岁", "40-50岁", "50-60岁", "60岁以上" });// 设置年龄段数组并最终转换为List类型
ages = new ArrayAdapter<CharSequence>(this,
android.R.layout.simple_spinner_item, age_data);// 实例化ArrayAdapter
ages.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);// 设置列表项显示风格
age.setAdapter(ages);// 设置显示信息
LinearLayout layout = (LinearLayout) super.findViewById(R.id.layout);
TextView ageLabel=new TextView(this);
ageLabel.setText("请选择您的年龄段");
layout.addView(ageLabel);
layout.addView(age);
}
}
在此之前,不要忘了在main.xml中为我们的布局管理器加上ID属性,这样才能在程序中进行调用,运行程序,我们可以看到如下效果:
点击即可弹出下拉列表框显示具体内容了。
下面我们在Android设备上来运行Spinner的示例程序,运行环境为Motorola Defy+ 2.3.7 MIUI,所得到的具体显示效果为:
可以看出,这和我们在模拟器中的显示效果略有不同,那么就是手机所刷ROM对我们组件显示风格的影响了,也就是说,在不同的ROM下,会有不同的显示效果。
相关文章推荐
- Android学习笔记九:基本视图组件:Spinner
- 界面编程之基本界面组件(7)ImageView(图像视图)
- Android学习笔记四:基本视图组件:TextView
- Android基本组件06(Spinner)
- Android学习笔记六:基本视图组件:EditText
- Android学习笔记十:基本视图组件:ImageView和ImageButton
- Android学习笔记七:基本视图组件:RadioGroup和RadioButton
- Android组件复习之基本组件07—Spinner
- 一步一步学android之基本控件——Spinner组件
- Android学习笔记五:基本视图组件:Button
- Android基本组件之图像视图等余下组件(自用)
- Android学习笔记八:基本视图组件:CheckBox
- Android学习笔记02:基本视图组件之TextView
- 【Android组件学习】Spinner的基本用法和Adapter的作用
- Android学习笔记四:基本视图组件:TextView
- Android组件复习之基本组件07—Spinner
- 【Android开发】基本组件-图像视图
- JSP的9种基本内置组件
- 事实模型的两种基本组件:术语与事实
- Delphi编写组件封装asp代码的基本步骤(Asp组件系列)