android学习笔记(23)android Spinner的功能和用法

文章标签: android,android-spinner
2014-12-16 11:29:22     19 人阅读    

Spinner的功能和用法
Spinner组件与Swing编程Spinner不同,实就是一个列表选择框。不过Android的列表选择框并不是需要显示下拉列表的,而是相当 于弹出一个菜单供用户选择。
Spinner是ViewGroup的间接子类,因此它也可作为容器使用。Spinner支持如表2.14所 示的常用XML属性。
       XML属性                                           说 明     

android: prompt                     设置该列表选择框的提示
android:cntrics                       使用数组资源设置该下拉列表框的列表项
表2.14 Spinner的常用XML属性
如果开发者使用Spinner时已经可以确定下拉列表框里的列表项,则完全不需要编写代 码,只要为Spinner指定android:entries厲性即可实现一个下拉列表框,如以下界面布局文件
所示。
程序清单:res\layout\main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 >
<!-- 定义了一个Spinner组件,指定该显示该Spinner组件的数组 -->
<Spinner
 android:layout_width="fill_parent" 
 android:layout_height="wrap_content"
 android:entries="@array/books" 
 />


</LinearLayout>

上面的界而布局文件中使用@array/books指定数组资源,因此我们需要在res/value目录 下使用XML文件来定义一份数组资源,该数组资源文件的内容如下。
程序淸中.:\SpinnerTest\res\values\arrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
 <string-array name="books">
  <item>疯狂Java讲义</item>
  <item>疯狂Ajax讲义</item>
  <item>疯狂XML讲义</item>
 </string-array>
 </resources>


使用Activity显示上面的界而布局,将看到如图2.29所示的界而。
实例:不存储列表项的Spinner
对于Spinner而言,它也许需要显示一个供用户选择的列表 ——至于这个列表到底以数组的形式给出,还是以其他什么形式给出,这不重要。重要的是Spinner知道它的每项应该显示什么。
为了让Spinner知道每项应该显示什么,我们可以提供一个内容Adapter,这个Adapter 负责决定Spinner列表的每项显示什么。例如我们提供一个如下所示的匿名内部类。
程序清单:src\org\crazyit\spinner\SpinnerTest2.java

package org.crazyit.spinner;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TableLayout;
import android.widget.TextView;
public class SpinnerTest2 extends Activity
{
 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  BaseAdapter ba = new BaseAdapter()
  {
   @Override
   public int getCount()
   {
    //指定一共包含10个选项
    return 10;
   }

   @Override
   public Object getItem(int position)
   {
    return null;
   }

   @Override
   public long getItemId(int position)
   {
    // TODO Auto-generated method stub
    return 0;
   }
//   //重写该方法,该方法返回的View将作为列表框的每项
//   @Override
//   public View getView(int position, View convertView, ViewGroup parent) 
//   {
//    TextView text = new TextView(SpinnerTest2.this);
//    text.setText(position"");
//    text.setTextSize(20);
//    text.setTextColor(R.color.red);
//    return text;
//   }
   //重写该方法,该方法返回的View将作为列表框的每项
   @Override
   public View getView(int position, View convertView, ViewGroup parent) 
   {
    //创建一个LinearLayout,并向其中添加2个组件
    LinearLayout line = new LinearLayout(SpinnerTest2.this);
    line.setOrientation(0);
    ImageView image = new ImageView(SpinnerTest2.this);
    image.setImageResource(R.drawable.icon);
    TextView text = new TextView(SpinnerTest2.this);
    text.setText(position + "");
    text.setTextSize(20);
    text.setTextColor(R.color.red);
    line.addView(image);
    line.addView(text);
    //返回LinearLayout实例
    return line;
   }  
  };
  Spinner spinner = (Spinner)findViewById(R.id.test);
  spinner.setAdapter(ba);
 }
}


上面内部类的粗体字代码重写了 getView方法,该方法会决定Spinner的列表框的每个列 表项显示什么:该方法返回什么View对象,每个列表项就显示什么,一旦提供了如上所示 的Adapter之后,接下来就可为Spinner设置使用该Adapter,如以下代码所示。
Spinner spinner = (Spinner)findViewById(R.id.test);
spinner.setAdapter(ba);
这里示例程序的界面布局很简单,此处不再给出
通过为Spinner提供Adapter可以非常灵活地定制Spinner,包括重 绘Spinner的列表的外观。只要你喜欢,可以让重写getView方法返回任意的View对象,该 对象将会作为Spinner的列表项。如果将上面的getView方法改为如下形式:
 

@Override
   public View getView(int position, View convertView, ViewGroup parent) 
   {
    //创建一个LinearLayout,并向其中添加2个组件
    LinearLayout line = new LinearLayout(SpinnerTest2.this);
    line.setOrientation(0);
    ImageView image = new ImageView(SpinnerTest2.this);
    image.setImageResource(R.drawable.icon);
    TextView text = new TextView(SpinnerTest2.this);
    text.setText(position + "");
    text.setTextSize(20);
    text.setTextColor(R.color.red);
    line.addView(image);
    line.addView(text);
    //返回LinearLayout实例
    return line;
   }  
  };


上面的getView方法返回一个LinearLayout对象,该对象里先有一个ImageView,后面 有一个TextView——这说明Spimier的列表框的每个列表项都是LinearLayout对象。
 

图2.30不保存列表项的Spinner 图2.31自定义Spinner的列表项外观


原文地址:http://www.itmmd.com/201412/324.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

产品经理学习笔记(10)-到用户中去:找到你的核心用户   上一篇
下一篇  node.js依赖的 JavaScript基础 字符串处理方法

精彩回复
发表评论
姓名:       

《程序员app》专门为程序员量身定做!