Android中Spinner组件的使用解析
1,Spinner概述
Spinner是ViewGroup类得一个子孙类,其继承关系如下:
View--->ViewGroup--->AdapterView--->AbsSpinner--->Spinner
默认情况下Spinner显示的是当前选中的元素值,当每次点击Spinner时,都会弹出菜单列表供用户选择,从该菜单列表中可以为Spinner选择一个新的元素值.
2,Spinner的简单用法
在activity_spinner_demo1.xml中添加Spinner控件
其中android:entries="@array/languages"表示Spinner的数据集合是从资源数组languages中获取的,languages数组资源定义在values/arrays.xml中:
- c语言
- java
- php
- xml
- html
SpinnerDemo1Activity中通过OnItemSelectedListener的回调方法实现响应Spinner选择事件:
/*
布局中获取数据源
*/
public class SpinnerDemo1Activity extends AppCompatActivity {
protected Spinner spinner1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_spinner_demo1);
initView();
}
private void initView() {
//布局中获取数据源
spinner1 = (Spinner) findViewById(R.id.spinner1);
spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView parent, View view, int position, long id) {
String[] array = getResources().getStringArray(R.array.languages);
Toast.makeText(SpinnerDemo1Activity.this, "选择了" + array[position], Toast.LENGTH_LONG).show();
}
@Override
public void onNothingSelected(AdapterView parent) {
}
});
}
}
运行结果如下图所示:
3,通过适配器的方式获取数据集合
使用这种方式来获取数据源,就不要在activity_spinner_demo2.xml布局中设置 android:entries="@array/languages" 属性了:
这里我们使用的适配器为ArrayAdapter,SpinnerDemo2Activity代码如下
//实例化控件
spinner2 = (Spinner) findViewById(R.id.spinner2);
//创建数据适配器并绑定数据
final ArrayAdapter adapter = ArrayAdapter.createFromResource(this, R.array.languages, android.R.layout.simple_spinner_item);
spinner2.setAdapter(adapter);
spinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView parent, View view, int position, long id) {
CharSequence item = adapter.getItem(position);
Toast.makeText(MainActivity.this, "---->" + item, Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView parent) {
}
});
4,使用自定义的BaseAdapter获取数据集合
这种情况适用于Spinner的选择条目比较复杂的情况,比如带有图标.
首先activity_spinner_mode_dropdown.xml布局放置控件:
SpinnerDemo3Activity中:
public class SpinnerDemo3Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int mode = getIntent().getIntExtra("mode", Spinner.MODE_DROPDOWN);
if (mode == Spinner.MODE_DROPDOWN) {
setContentView(R.layout.activity_spinner_mode_dropdown);
} else {
setContentView(R.layout.activity_spinner_mode_dialog);
}
//使用自定义的BaseAdapter
Spinner spinner3 = (Spinner) findViewById(R.id.spinner3);
final List persons = new ArrayList();
persons.add(new Person("张三", "上海 "));
persons.add(new Person("李四", "上海 "));
persons.add(new Person("王五", "北京"));
persons.add(new Person("赵六", "广州 "));
// 建立Adapter绑定数据源
MyAdapter pAdapter = new MyAdapter(this, persons);
spinner3.setAdapter(pAdapter);
spinner3.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView parent, View view, int position, long id) {
Toast.makeText(SpinnerDemo3Activity.this, "--->" + persons.get(position).getName() + "--" + persons.get(position).getCity(), Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView parent) {
}
});
}
}
实体对象Person:
public class Person {
private String name;
private String city;
public Person() {
}
public Person(String name,String city) {
super();
this.name = name;
this.city = city;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
MyAdapter:
public class MyAdapter extends BaseAdapter {
private List mPersons;
public MyAdapter(Context context, List persons) {
mPersons = persons;
}
@Override
public int getCount() {
return mPersons == null ? 0 : mPersons.size();
}
@Override
public Object getItem(int position) {
return mPersons.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
ViewHolder viewHolder = null;
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.item_spinner_person, null);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
}else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.tvName.setText(mPersons.get(position).getName());
viewHolder.tvCity.setText(mPersons.get(position).getCity());
return convertView;
}
static class ViewHolder {
protected TextView tvName;
protected TextView tvCity;
ViewHolder(View rootView) {
initView(rootView);
}
private void initView(View rootView) {
tvName = (TextView) rootView.findViewById(R.id.tv_name);
tvCity = (TextView) rootView.findViewById(R.id.tv_city);
}
}
}
item_spinner_person.xml菜单条目:
运行效果:
5,Spinner的菜单显示方式
Spinner有两种显示形式,一种是下拉菜单,一种是弹出框,菜单显示形式是spinnerMode属性决定的:
android:spinnerMode="dropdown"
android:spinnerMode="dialog"
以上用的都是下拉菜单的显示,我们接下来看看弹出框的显示,只需将SpinnerDemo3Activity中的布局使用activity_spinner_mode_dialog.xml:
其运行效果如下:
6,Spinner的常用其他xml属性汇总:
entries: 直接在xml布局文件中绑定数据源
android:entries="@array/languages"
prompt:在Spinner弹出选择对话框的时候对话框的标题
android:prompt="@string/dialog_title"
dropDownVerticalOffset:
spinnerMode=”dropdown”时,下拉的项目选择窗口在垂直方向相对于Spinner窗口的偏移量
android:dropDownVerticalOffset="40dp"
对应代码中的方法:
public void setDropDownVerticalOffset(int pixels){}
dropDownWidth:
在spinnerMode=”dropdown”时,设定下拉框的宽度
android:dropDownWidth="wrap_content"
对应代码中的方法:
public void setDropDownWidth(int pixels) {}
dropDownSelector:
用于设定spinnerMode=”dropdown”时列表选择器的显示效果
popupBackground:设置下拉框背景色
android:popupBackground="@drawable/bg_d_sp_spinner"
对应代码中的方法:
public void setPopupBackgroundResource(int resId) { }
7,自定义Spinner下三角样式
隐藏下三角:
1,自己写一个xml背景不带小图标,把原来的背景替换掉
bg_d_sc_spinner_no_icon.xml如下:
-
-
2,只需将spinner的背景设置为透明即可
运行效果如下图:
自定义一个下三角或者其他图标:
自己写一个xml背景带小图标,把原来的背景替换掉
bg_d_sc_spinner.xml如下:
-
-
-