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);

return
ll;
}


重写事件中的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);
}
}


最后,别忘了注册该事件。=。=

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值