Spinner是android常用控件之一,为用户提供了下拉选择式菜单。
一个最基本的Spinner如下图:
图1
点击后有选项可以进行选择,如图所示:
图2
要实现这么一个简单的Spinner,要分这么几步
首先,我们要先在main.xml布局文件当中声明一个Spinner控件。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Spinner android:id="@+id/spinner" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
然后在values文件夹下的strings.xml中声明一个string数组,格式如下,该数组的元素即为菜单的选项,在这里,我们将选项设为几个人名。
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, SpinnerTestActivity!</string> <string name="app_name">SpinnerTest</string> <string-array name="people_array"> <item >David</item> <item >Tom</item> <item>Nick</item> <item>Blues</item> </string-array> </resources>
好了,基础的工作已经做好了,下面就要用java代码去实现它
首先,我们要声明一个spinner对象,并通过findViewById方法去实例化它。
private Spinner spinner=null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); spinner=(Spinner)findViewById(R.id.spinner);
然后,需要给它一个适配器adapter,这里我们用ArrayAdapter。对于Spinner,android给我们提供了一套标准的样式,虽然看上去很普通,但实现起来却非常方便。这里我们先用android自带的样式去实现一个菜单。它的具体实现方法如下:
ArrayAdapter<CharSequence> adapter=ArrayAdapter.createFromResource(this,
R.array.people_array, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); spinner.setPrompt("人物");
一个ArrayAdapter对象通过方法createFromResource()来生成,createFromResource()方法的三个参数分别为上下文,你的string数组,还有系统自带的spinner样式。
注意,这里的android.R.layout.simple_spinner_item只是指的是初始的样式,即是文章的图1,还需要用
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
来定义下拉后风格,即图2,布局android.R.layout.simple_spinner_dropdown_item也是android自带的
再将适配器adapter与空间spinner匹配好,至于函数setPrompt的作用,看图2就明白了。
接下来,我们还是要给Spinner添加消息响应事件。代码如下:
spinner.setOnItemSelectedListener(new OnItemSelectedListener(){ @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub long selected=arg0.getItemIdAtPosition(arg2); System.out.println(selected); } @Override public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub System.out.println("Nothing selected !"); } });
这里只是简单地实现了一个spinner的消息响应事件,首先,对于spinner的消息响应类是 OnItemSelectedListener,对于这个类要重载两个方法onItemSelected()和onNothingSelected()。前一个函数是在菜单当中一个item被点击后触发的,第二个函数是在一个选项从菜单中消失时触发的,在这里没有作用。so我们忽略它。主要说说第一个函数onItemSelected()。
这个函数有四个参数,分别为AdapterView,它是第二个参数View的父控件,而View即指的是当前被选中的View,第三个参数是他的position,第四个参数是它的id。
好了,将消息响应事件添加到spinner控件后,一个入门级的下拉菜单就做好了。
但是,这个下拉菜单的样式是系统自带的,而且菜单的选项定义在strings.xml当中,无法满足动态性,那该如何去解决这两个问题呢?
其实很简单,我们可以在代码中动态生成一个下拉菜单,而不需要先在strings.xml中定义。
相比起上面的代码,绝大部分都差不多,只需要做些小改动。方法如下:
先声明一个string类型的arraylist,将你所要放入菜单的选项放入其中。
ArrayList<String> list=new ArrayList<String>(); list.add("David"); list.add("Tom"); list.add("Nick"); list.add("Blues");
然后声明一个ArrayAdapter对象,注意和上面声明时的区别。
ArrayAdapter adapter=new ArrayAdapter(this,R.layout.item,R.id.text,list);
类ArrayAdapter类的构造函数需要四个参数,分别为上下文,你的自定义布局文件,一个textview的id,还有你的arraylist对象,在布局文件中一定要含有一个textview控件去显示选项。这个自定义的布局文件就由你自己设计了,你可以把它设计的好看点,但是我在这里只是简单实现了一下,只加了一个textview。
代码如下:item.xml
<?xml version="1.0" encoding="UTF-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/text" android:layout_width="fill_parent" android:layout_height="wrap_content" > </TextView> </LinearLayout>
这样你就实现了一个自定义的spinner,而且长度还可以动态变化。
效果图如下(难看了点~):
图3
点击后效果
下面是java代码的完整版,其中两种方法都有实现,第二种方法由注释显示:
package com.suns.spinner; import java.util.ArrayList; 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; public class SpinnerTestActivity extends Activity { /** Called when the activity is first created. */ private Spinner spinner=null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); spinner=(Spinner)findViewById(R.id.spinner); // ArrayList<String> list=new ArrayList<String>(); // list.add("David"); // list.add("Tom"); // list.add("Nick"); // list.add("Blues"); // // ArrayAdapter adapter=new ArrayAdapter(this,R.layout.item,R.id.text,list); ArrayAdapter<CharSequence> adapter=ArrayAdapter.createFromResource(this, R.array.people_array, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); spinner.setPrompt("人物"); spinner.setOnItemSelectedListener(new OnItemSelectedListener(){ @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub long selected=arg0.getItemIdAtPosition(arg2); System.out.println(selected); } @Override public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub System.out.println("Nothing selected !"); } }); } }
好了,相信看到这里你对spinner的用法也有了大致了解,谢谢!~