Spinner控件的使用
Spinner 使用方法小结
android里的Spinner其实就是个ComboBox =。=
一。基本使用方法:
main.xml 不多解释
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Spinner
android:id="@+id/mySpinner"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
在string.xml中使用“string-array”定义数据源。
<?xmlversion="1.0"encoding="utf-8"?>
<resources>
<stringname="app_name">MySpinnerDemo</string>
<string-arrayname="phones_array">
<item>iPhone</item>
<item>Android</item>
<item>BlackBerry</item>
</string-array>
</resources>
Activity类:
packagecom.yinger;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.widget.AdapterView;
importandroid.widget.ArrayAdapter;
importandroid.widget.Spinner;
importandroid.widget.AdapterView.OnItemSelectedListener;
/**
*SpinnerDemo
*@authorYinger
*@time2011-7-9下午01:54:59
*@mailmelody.crazycoding@gmail.com
*/
publicclassSpinnerDemoextendsActivity{
Spinnerspinner=null;
Stringselected="0";
/**Calledwhentheactivityisfirstcreated.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
spinner=(Spinner)findViewById(R.id.mySpinner);
initMySpinner();
}
privatevoidinitMySpinner(){
ArrayAdapter<CharSequence>adapter=ArrayAdapter.createFromResource(
this,R.array.phones_array,
android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setPrompt("test");
spinner.setOnItemSelectedListener(newSpinnerOnSelectedListener());
}
classSpinnerOnSelectedListenerimplementsOnItemSelectedListener{
publicvoidonItemSelected(AdapterView<?>adapterView,Viewview,intposition,
longid){
//TODOAuto-generatedmethodstub
selected=adapterView.getItemAtPosition(position).toString();
System.out.println("selected===========>"+selected);
}
publicvoidonNothingSelected(AdapterView<?>arg0){
//TODOAuto-generatedmethodstub
System.out.println("selected===========>"+"Nothing");
}
}
}
二。debug发现的一个小问题:
Spinner在初始化时会自动调用一次OnItemSelectedListener事件
原因:有人说是Bug,其实这与C#的事件机制类似,懒得说了=。=
提供的解决办法:
个人是通过在事件注册之前调用
spinner.setSelection(0,true);
但要注意,使用此方法,如果用户选择的也是第一项,那么OnItemSelectedListener事件不会被触发……
三。使用技巧
1.动态添加Spinner的数据源
修改initMySpinner方法,代码如下:
privatevoidinitMySpinner(){
String[]phones={"iPhone","Android","BlackBerry"};
ArrayAdapter<String>adapter=newArrayAdapter<String>(
this,android.R.layout.simple_spinner_item,
phones);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setPrompt("test");
spinner.setSelection(0,true);
spinner.setOnItemSelectedListener(newSpinnerOnSelectedListener());
}
2.自定义Spinner的Layout,替换掉体统默认的android.R.layout.simple_spinner_item
super easy
my_spinner_item.xml:
<?xmlversion="1.0"encoding="utf-8"?>
<TextViewxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="12dip"
android:textColor="#FF8B1500"
android:gravity="center"/>
修改adapter:
ArrayAdapter<String>adapter=newArrayAdapter<String>(
this,R.layout.my_spinner_item,
phones);
同理,可自定义layout,替换掉android.R.layout.simple_spinner_dropdown_item
3.同时显示图片和文本
自定义Adapter:
packagecom.yinger;
importandroid.content.Context;
importandroid.graphics.Color;
importandroid.view.Gravity;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.BaseAdapter;
importandroid.widget.ImageView;
importandroid.widget.LinearLayout;
importandroid.widget.TextView;
/**
*自定义Adapter
*@authorYinger
*@time2011-7-9下午03:39:34
*@mailmelody.crazycoding@gmail.com
*/
publicclassMyAdapterextendsBaseAdapter{
privateContextctx;
privateintdrawableIDs[];
privateintstringIDs[];
publicMyAdapter(Contextctx,intDrawableIDs[],intStringIDs[])
{
this.ctx=ctx;
this.drawableIDs=DrawableIDs;
this.stringIDs=StringIDs;
}
publicintgetCount(){
//TODOAuto-generatedmethodstub
returndrawableIDs.length;
}
publicObjectgetItem(intposition){
//TODOAuto-generatedmethodstub
returndrawableIDs[position];
}
publiclonggetItemId(intposition){
//TODOAuto-generatedmethodstub
returnposition;
}
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
//TODOAuto-generatedmethodstub
LinearLayoutll=newLinearLayout(ctx);
ll.setOrientation(LinearLayout.HORIZONTAL);
ll.setGravity(Gravity.CENTER_VERTICAL);
ImageViewiv=newImageView(ctx);
iv.setImageResource(drawableIDs[position]);
iv.setLayoutParams(newViewGroup.LayoutParams(100,40));
ll.addView(iv);
TextViewtv=newTextView(ctx);
tv.setText(stringIDs[position]);
tv.setTextSize(14);
tv.setTextColor(Color.BLUE);
ll.addView(tv);
returnll;
}
}
修改initMySpinner方法:
privatevoidinitMySpinner(){
int[]phonePics={R.drawable.apple,R.drawable.android,R.drawable.blackberry};
int[]phones={R.string.iphone,R.string.android,R.string.blackberry};
MyAdapteradapter=newMyAdapter(this,phonePics,phones);
spinner.setAdapter(adapter);
spinner.setPrompt("test");
spinner.setSelection(0,true);
}
OK,但使用自定义的Adapter,我们如何来获取选中的文本信息呢?
在MyAdapter中,修改getView方法,添加黄色区域代码如下:
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
//TODOAuto-generatedmethodstub
LinearLayoutll=newLinearLayout(ctx);
ll.setOrientation(LinearLayout.HORIZONTAL);
ll.setGravity(Gravity.CENTER_VERTICAL);
ImageViewiv=newImageView(ctx);
iv.setImageResource(drawableIDs[position]);
iv.setLayoutParams(newViewGroup.LayoutParams(100,40));
ll.addView(iv);
TextViewtv=newTextView(ctx);
tv.setText(stringIDs[position]);
tv.setTextSize(14);
tv.setTextColor(Color.BLUE);
tv.setTag("tagTextView");
ll.addView(tv);
returnll;
}
重写事件中的onItemSelected方法:
//TODOAuto-generatedmethodstub
publicvoidonItemSelected(AdapterView<?>adapterView,Viewview,intposition,
longid){
if(adapterView.getId()==R.id.mySpinner)
{
LinearLayoutll=(LinearLayout)view;
TextViewtv=(TextView)ll.findViewWithTag("tagTextView");
Stringstr=(String)tv.getText();
System.out.println("selected===========>"+str);
}
}
最后,别忘了注册该事件。=。=
更多相关文章
- 十七、Android学习笔记_Android(安卓)使用 搜索框
- Android(安卓)4.0.3 源码编译中添加外部jar包和外部so到apk的方
- Android(安卓)按钮点击两次触发不同的事件
- Android(安卓)编程下 Touch 事件的分发和消费机制
- Android中的dispatchTouchEvent()、onInterceptTouchEvent()和on
- Android四大基本组件介绍与生命周期
- android - edittext 默认隐藏软键盘
- 浅谈Java中Collections.sort对List排序的两种方法
- Python list sort方法的具体使用