Spinner 初步应用

 

 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的用法也有了大致了解,谢谢!~

 

 

 

你可能感兴趣的:(Spinner)