AndroidSpinner控制详细说明
摘要: Spinner出示了从一数量据结合中迅速挑选一项值的方法。默认设置状况下Spinner显示信息的是当今挑选的值,点一下Spinner会弹出来一个包括全部可选择值的dropdown莱单,从该莱单中能够为...
Spinner出示了从一数量据结合中迅速挑选一项值的方法。默认设置状况下Spinner显示信息的是当今挑选的值,点一下Spinner会弹出来一个包括全部可选择值的dropdown莱单,从该莱单中能够为Spinner挑选一个新值。
图中显示信息的是Spinner普遍的款式。本文中我将探讨1.Spinner的基本使用方法 2.设定Spinner的Adapter (arrayadapter 和自定BaseAdapter)3.Spinner的莱单显示信息方法 4.Spinner的xml特性
非常简单的Spinner在合理布局文档中加上Spinner控制
LinearLayout android:layout_width= fill_parent android:layout_height= fill_parent android:orientation= vertical Spinner android:id= @+id/spinner1 android:layout_width= wrap_content android:layout_height= wrap_content android:entries= @array/languages /LinearLayout
在其中android:entries= @array/languages 表明Spinner的数据信息结合是以資源数字能量数组languages中获得的,languages数字能量数组資源界定在values/arrays.xml中:
?xml version= 1.0 encoding= utf-8 ? resources string-array name= languages item c語言 /item item java /item item php /item item xml /item item html /item /string-array /resources
假如你没必须对Spinner的挑选恶性事件做响应,那麼一个详细的Spinner应用步骤就完毕了。
运作結果:
自然,一般状况下大家是必须响应Spinner挑选恶性事件的,能够根据OnItemSelectedListener的回调函数方式完成
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Spinner spinner = (Spinner) findViewById(R.id.spinner1); spinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView ? parent, View view, int pos, long id) { String[] languages = getResources().getStringArray(R.array.languages); Toast.makeText(MainActivity.this, 你点一下的是: +languages[pos], 2000).show(); @Override public void onNothingSelected(AdapterView ? parent) { // Another interface callback
上边的Spinner看上去十分好看,但是它其实不是一直这般,不久见到的是在android:Theme.Holo.Light主题风格下的实际效果,一样的编码假如在android:Theme.Light下边便会越来越难看。
想来这也是许多人不愿应用Spinner的缘故了吧。假如想适配2.3,则只有承受那样的实际效果。
设定Spinner的Adapter
上边应用Spinner数据信息来源于xml数字能量数组,实际上用的数最多的還是根据adapter来跟Spinner关联数据信息。
应用ArrayAdapter
// 原始化控制 Spinner spinner = (Spinner) findViewById(R.id.spinner1); // 创建数据信息源 String[] mItems = getResources().getStringArray(R.array.languages); // 创建Adapter而且关联数据信息源 ArrayAdapter String adapter=new ArrayAdapter String (this,android.R.layout.simple_spinner_item, mItems); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); //关联 Adapter到控制 spinner .setAdapter(adapter); spinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView ? parent, View view, int pos, long id) { String[] languages = getResources().getStringArray(R.array.languages); Toast.makeText(MainActivity.this, 你点一下的是: +languages[pos], 2000).show(); @Override public void onNothingSelected(AdapterView ? parent) { // Another interface callback });
它是Spinner的规范应用方式,在其中,有二行编码能够决策Spinner的外型:
ArrayAdapter String adapter=new ArrayAdapter String (this,android.R.layout.simple_spinner_item, mItems);
第二个主要参数是Spinner未进行莱单时Spinner的默认设置款式,android.R.layout.simple_spinner_item是系统软件内置的内嵌合理布局。
2
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
设定的是进行的情况下往下拉莱单的款式(留意和上边差别),同样android.R.layout.simple_spinner_dropdown_item也是内嵌合理布局。
假如不设定adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)会如何呢?
会导致未进行的sipnner和进行的莱单全是一种合理布局款式。下边一运作截屏来讲明:
沒有adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item):
有setDropDownViewResource:
你可以能会非常好奇假如设定了setDropDownViewResource可是setDropDownViewResource的主要参数和ArrayAdapter的第二个合理布局主要参数(simple_spinner_item)一致的状况下能如何。状况是和沒有setDropDownViewResource是一样的,由于上边讲过不设定setDropDownViewResource Spinner未进行和进行全是用的一样的合理布局。
实际上simple_spinner_item和simple_spinner_dropdown_item二者的姓名恰好体现了她们的差别。一个运用于往下拉一个运用于Spinner自身。
应用自定的BaseAdapter这类状况可用于spinner较为繁杂的状况,例如含有标志。
下边大家界定一个挑选联络人的Spinner。
LinearLayout android:layout_width= fill_parent android:layout_height= 80dip android:orientation= vertical Spinner android:id= @+id/spinner2 android:layout_width= wrap_content android:layout_height= wrap_content /LinearLayout
activity中:
// 原始化控制 Spinner spinner2 = (Spinner) findViewById(R.id.spinner2); // 创建数据信息源 List Person persons=new ArrayList Person persons.add(new Person( 张三 , 上海市 persons.add(new Person( 李四 , 上海市 persons.add(new Person( 王五 , 北京市 )); persons.add(new Person( 赵六 , 广州市 // 创建Adapter关联数据信息源 MyAdapter _MyAdapter=new MyAdapter(this, persons); //关联Adapter spinner2.setAdapter(_MyAdapter);
Person.java
.example.spinnerdemo; public class Person { private String personName; private String personAddress; public Person(String personName, String personAddress) { super(); this.personName = personName; this.personAddress = personAddress; public String getPersonName() { return personName; public void setPersonName(String personName) { this.personName = personName; public String getPersonAddress() { return personAddress; public void setPersonAddress(String personAddress) { this.personAddress = personAddress; }
MyAdapter.java
.example.spinnerdemo; import java.util.List; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; * 自定兼容器类 * @author jiangqq a href=jiangqq /a public class MyAdapter extends BaseAdapter { private List Person mList; private Context mContext; public MyAdapter(Context pContext, List Person pList) { this.mContext = pContext; this.mList = pList; @Override public int getCount() { return mList.size(); @Override public Object getItem(int position) { return mList.get(position); @Override public long getItemId(int position) { return position; * 下边是关键编码 @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater _LayoutInflater=LayoutInflater.from(mContext); convertView=_LayoutInflater.inflate(R.layout.item_custom, null); if(convertView!=null) { ImageView imageView = (ImageView)convertView.findViewById(R.id.image); imageView.setImageResource(R.drawable.ic_launcher); TextView _TextView1=(TextView)convertView.findViewById(R.id.textView1); TextView _TextView2=(TextView)convertView.findViewById(R.id.textView2); _TextView1.setText(mList.get(position).getPersonName()); _TextView2.setText(mList.get(position).getPersonAddress()); return convertView; }
运作实际效果:
Spinner的莱单显示信息方法
它有二种显示信息方式,一种是往下拉莱单,一种是弹出来框,莱单显示信息方式是spinnerMode特性决策的:
android:spinnerMode= dropdown android:spinnerMode= dialog
在android2.3上沒有这一特性,系统软件默认设置将Spinner弹出来莱单显示信息成dialog。下边是Theme.Light和Theme.Holo.Light下Spinner不在同方式下的实际效果比照图。
实际上上边早已提及了Spinner的2个特性:
1 entries: 立即在xml合理布局文档中关联数据信息源(能够不设定,就可以以在Activity中动态性关联)
2 spinnerMode: Spinner的显示信息方式
此外也有以下特性:
prompt:在Spinner弹出来挑选会话框的情况下会话框的题目:
特性名字
android:dropDownHorizontalOffset
相匹配方式:
setDropDownHorizontalOffset(int)
spinnerMode= dropdown 时,往下拉的新项目挑选对话框在水准方位相对性于Spinner对话框的偏位量。
它务必是一个含有企业的浮点型规格值,如: 14.5sp 。合理的企业包含:px(清晰度)、dp(相对密度不相干的清晰度)、sp(根据引入字体样式的规格来放缩的清晰度)、in(英寸)、mm(mm)。
这一特性还能够引入一个資源(文件格式:@[package:]type:name)或是是包括这类种类值的主题风格特性(文件格式:?[package][type:]name)。
这一特性相匹配全局性特性資源标记dropDownHorizontalOffset。
android:dropDownSelector
用以设置spinnerMode= dropdown 时目录挑选器的显示信息实际效果。
它能够用 @[+][package]:type:name 文件格式来引入此外的資源,或是是用 ?[package:][type:]name 的文件格式来 运用主题风格特性,还能够是 #rgb 、 #argb 、 #rrggbb 、 aarrggbb 文件格式的色调值。
它相匹配的全局性特性資源标记是dropDownSelector。
android:dropDownVerticalOffset
相匹配方式:
setDropDownVerticalOffset(int)
spinnerMode= dropdown 时,往下拉的新项目挑选对话框在竖直方位相对性于Spinner对话框的偏位量。
这一特性它务必是一个含有企业的浮点型规格值,如: 14.5sp 。合理的企业包含:px(清晰度)、dp(相对密度不相干的清晰度)、sp(根据引入字体样式的规格来放缩的清晰度)、in(英寸)、mm(mm)。
还能够引入一个資源(文件格式:@[package:]type:name)或是是包括这类种类值的主题风格特性(文件格式:?[package][type:]name)。
这一特性相匹配全局性特性資源标记dropDownVerticalOffset。
android:dropDownWidth
相匹配方式:
setDropDownWidth(int)
在spinnerMode= dropdown 时,设置往下拉框的总宽。
这一特性能够是含有企业的浮点型的规格值,如:14.5sp。合理的企业包含:px(清晰度)、dp(相对密度不相干的清晰度)、sp(根据引入字体样式的规格来放缩的清晰度)、in(英寸)、mm(mm)。
还能够引入一个資源(文件格式:@[package:]type:name)或是是包括这类种类值的主题风格特性(文件格式:?[package][type:]name)。
还能够是以下变量定义之一:
fill_parent = -1,往下拉框的总宽应当应用显示屏的总宽来设置。这一变量定义从API Level 8刚开始被废料了,而且应用mach_parent变量定义来替代。
mach_parent = -1,往下拉框的总宽应当应用显示屏的总宽来设置。在API Level 8中被引进。
wrap_content = -2,往下拉框的总宽应当跟它的內容相一致。
它相匹配的全局性資源标记是dropDownWidth。
android:gravity
相匹配方式:
1
setGravity(int)
这一特性用以设定当今挑选的新项目的两端对齐方法。
它务必是下列变量定义值之一或组成(用 | 标记分离出来)。
top = 0x30:把挑选的目标放进它的器皿的顶端,不变变它的规格。
bottom = 0x50:把挑选的目标放进它的器皿的底端,不变变它的规格。
left = 0x03:把挑选的目标放进它的器皿的左侧,不变变它的规格。
right = 0x05:把挑选的目标放进它的器皿的右侧,不变变它的规格。
center_vertical = 0x10:把挑选的目标放进它的器皿的竖直管理中心,不变变它的规格。
fill_vertical = 0x70:以便彻底的添充它的器皿,系统软件会依据必须来提升挑选目标的竖直规格。
center_horizontal = 0x01:把挑选的目标放进它的器皿的水准管理中心,不变变它的规格。
fill_horizontal = 0x07:以便彻底的添充它的器皿,系统软件会依据必须来提升挑选目标的水准规格。
center = 0x11:把挑选的目标放进它的器皿的竖直和水准管理中心,不变变它的规格。
fill = 0x77:以便彻底的添充它的器皿,系统软件会依据必须来提升挑选目标的水准和竖直规格。
clip_vertical = 0x80:额外的可选择设定,它能够设定器皿内子目标的左右边沿剪裁它的器皿外框。剪裁会根据竖直两端对齐的方法:顶端两端对齐的会剪裁底端边沿,底端两端对齐的会剪裁顶端边沿,不容易左右边沿都剪裁。
clip_horizontal = 0x08:额外的可选择设定,它能够设定器皿内子目标的上下边沿剪裁它的器皿外框。剪裁会根据水准两端对齐的方法:左两端对齐的会剪裁右侧缘,右两端对齐的会剪裁左侧缘,不容易上下边沿都剪裁。
start = 0x:把目标放进它的器皿的刚开始部位,不变变它的规格。
end = 0x:把目标放进它的器皿的完毕部位,不变变它的规格。
相匹配的全局性特性資源标记是gravity。
注:Spinner目标是一个视窗目标器皿,设定它的gravity特性时,总是更改器皿內部子视窗目标的两端对齐方法,其实不会更改子视窗內部內容的两端对齐方法。
android:popupBackground
相匹配方式:
1
setPopupBackgroundResource(int)
在spinner= dropdown 时,应用这一特性来设定往下拉目录的情况。
可使用 @[+][package:]type:name 文件格式来引入此外的資源,或是应用 ?[package:][type:]name 文件格式来应 用主题风格特性,还可以应用 #rgb 、 #argb 、 #rrggbb 、 #aarrggbb 文件格式的色调值。
相匹配的全局性特性資源标记是popupBackground