Android Spinner
在Android的UI开发中,Spinner(下拉列表)总是可以用到的
Spinner是一个列表选择框,会在用户选择后,展示一个列表供用户进行选择。Spinner是ViewGroup的间接子类,它和其他的Android控件一样,数据需要使用Adapter进行封装。
Spinner
下面介绍一下Spinner的常用XML属性,Android也为其属性提供了相应的getter
、setter
方法:
- android:spinnerMode:列表显示的模式,有两个选择,为弹出列表
dialog
以及下拉列表dropdown
,如果不特别设置,默认为下拉列表。。 - android:entries:使用
<string-array.../>
资源配置数据源。 - android:prompt:对当前下拉列表设置标题,仅在dialog模式下有效。传递一个
“@string/name”
资源,需要在需要在资源文件中定义<string.../>
。
作为一个列表选择控件,Spinner具有一些选中选项可以触发的事件,但它本身没有定义这些事件,均继承自间接父类 AdapterView 。Spinner支持的几个常用事件有以下几个:
- AdapterView.OnItemCLickListener:列表项被点击时触发。
- AdapterView.OnItemLongClickListener:列表项被长按时触发。
- AdapterView.OnItemSelectedListener:列表项被选择时触发。
PS:因为适配器可以设置各种不同的样式,有选择、单选、多选,所以OnItemCLickListener和OnItemSelectedListener是适用于不同场景的。
Spinner的数据绑定
对于Spinner展示的数据源,一般使用两种方式设定数据:
- 通过XML资源文件设置,这种方式比较死板,但是如果仅仅需要展示固定的、简单的数据,这种方式还是可以考虑的,比较直观。
- 使用Adapter接口设置,这是最常见的方式,动态、灵活,可以设定各种样式以及数据来源。
Spinner使用XML资源文件设置数据
先来讲讲通过XML资源文件设置Spinner数据的方式,首先需要在/res/values目录下新建XML格式的资源文件,名字不重要,但是一般会使用strings.xml。在其中的<resourse.../>
标签下,定义<string-array.../>
标签,通过它中的<item.../>
标签来设置选择数据。
XML文件结构:
<?xml version="1.0" encoding="utf-8"?>
<resources>
……
<string-array name="arrayname">
<item>item1</item>
<item>item2</item>
<item>item3</item>
</string-array>
……
</resources>
通过适配器Adapter可以设定比较复杂的展示效果,一般项目中比较常用的也是这种方式。
下面通过一个示例,讲解一下上面说的属性、事件,以及使用ArrayAdapter和XML资源文件设定简单数据,代码中注释已经说的很清楚了,这里就不再累述了。
部分布局代码:
<TextView
android:id="@+id/tv_spinner_entriesshow"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#f2f2f2"
android:padding="10dp"
android:text="(entries)您的选择的是"
android:textSize="16sp" >
</TextView>
<Spinner
android:id="@+id/sp_spinner_entriescontent"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:entries="@array/arrayname" >
</Spinner>
然后在Activity里,直接使用
Resources res =getResources();
String[] arraynames=res.getStringArray(R.array.arrayname);
即可取得<string-array name="arrayname">"
下的所有item数据,简单又方便的一种方法。
Spinner使用Adapter接口设置数据
下面介绍一下最简单的Spinner使用Adapter接口设置数据
- 新建一个Android工程,名字为SpinnerTest。修改layout下的
activity_main.xml
,添加一个Textview和一个Spinner,文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#d7d7d7"
android:orientation="vertical"
tools:context="com.ylbf.spinnertest.MainActivity" >
<TextView
android:id="@+id/tv_spinner_show"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#f2f2f2"
android:padding="10dp"
android:text="您的选择的是"
android:textSize="16sp" >
</TextView>
<Spinner
android:id="@+id/sp_content"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
</Spinner>
<!-- 定义一个下拉菜单 -->
</LinearLayout>
- 修改你的
MainActivity.class
类,在这里我们就要自定义一个Spinner了,完整代码如下:
package com.ylbf.spinnertest;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView tv_show;
private Spinner sp_content;
private List<String> list = new ArrayList<String>();
private ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findView();
init();
setEvent();
display();
}
private void display() {
//为下拉列表定义一个适配器,这里就用到里前面定义的list。
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
//为适配器设置下拉列表下拉时的菜单样式。
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp_content.setAdapter(adapter);
}
private void init() {
list.add("北京");
list.add("上海");
list.add("深圳");
list.add("南京");
list.add("重庆");
}
private void setEvent() {
//为下拉列表设置各种事件的响应,这个事响应菜单被选中
sp_content.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
tv_show.setText("您选择的是:"+ adapter.getItem(position));
//或者使用以下方法 在提交取值时比较方便
//tv_show.setText("您选择的是:"+ sp_content.getSelectedItem().toString());
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
tv_show.setText("请您选择内容");
}
});
}
private void findView() {
tv_show = (TextView) findViewById(R.id.tv_spinner_show);
sp_content = (Spinner) findViewById(R.id.sp_spinner_content);
}
}
上面完成了Spinner最简单的选择一个内容,以一个TextView展示选择内容,Spinner使用Adapter接口设置数据;