Android NumberPicker

分享到:

NumberPicker是一个滑动数字选择控件,把指定范围内数字排列在垂直方向上下滑动,交互体验与之前讲过的TimePickerDatePicker类似。
NumberPicker控件主要用到的监听事件有两个分别是:
NumberPicker.OnValueChangeListener ,用于监听数值变化,通过此接口可以得到变化前的值和当前值
NumberPicker.OnScrollListener,用于监听滑动状态变化,其状态有SCROLL_STATE_FLING 、 SCROLL_STATE_IDLE 、 SCROLL_STATE_TOUCH_SCROLL,文章最后最详细解释这些状态的含义。
既然NumberPickersv 使用一组预定义并且有范围的数字,那么就需要设置相应的最小值和最大值,对应以下两个方法
numberPicker.setMinValue(0);//设置最小值为0
numberPicker.setMaxValue(20);//设置最大值为20
下面通过一个例子说明以上概念,效果图如下所示:

NumberPicker实例
NumberPicker实例

主界面XML布局代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          android:layout_width="match_parent"
          android:layout_height="match_parent" >

         <NumberPicker
          android:id="@+id/numberPicker1"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_centerHorizontal="true" />

         <Button
          android:id="@+id/button1"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_below="@+id/numberPicker1"
          android:layout_centerHorizontal="true"
          android:text="获取当前值" />

</RelativeLayout>

Activity文件代码:

package com.my.androidtest;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.NumberPicker;
import android.widget.NumberPicker.Formatter;
import android.widget.NumberPicker.OnScrollListener;
import android.widget.NumberPicker.OnValueChangeListener;
import android.widget.Toast;

public class NumberPickerActivity extends Activity implements OnValueChangeListener, Formatter, OnScrollListener {
          NumberPicker numberPicker=null;
          Button button=null;
          @Override
          protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_number_picker);
  
          numberPicker=(NumberPicker)this.findViewById(R.id.numberPicker1);
          numberPicker.setFormatter(this); //格式化数字,需重写format方法,详情见下面的代码
          numberPicker.setOnValueChangedListener(this); //值变化监听事件
          numberPicker.setOnScrollListener(this); //滑动监听事件
          numberPicker.setMinValue(0);//最小值
          numberPicker.setMaxValue(20);//最大值
          numberPicker.setValue(1);//设置初始选定值
  
          button=(Button)this.findViewById(R.id.button1);
          button.setOnClickListener(new OnClickListener(){
          @Override
          public void onClick(View arg0) {
          Toast.makeText(NumberPickerActivity.this, "当前值是:"+numberPicker.getValue(), Toast.LENGTH_SHORT).show();
          }
          });
  
          }
          @Override
          public void onScrollStateChange(NumberPicker view, int scrollState) {
          switch (scrollState) { 
          case OnScrollListener.SCROLL_STATE_FLING: 
          Toast.makeText(this, "scroll state fling", Toast.LENGTH_LONG) 
          .show(); 
          break; 
          case OnScrollListener.SCROLL_STATE_IDLE: 
          Toast.makeText(this, "scroll state idle", Toast.LENGTH_LONG).show(); 
          break; 
          case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL: 
          Toast.makeText(this, "scroll state touch scroll", Toast.LENGTH_LONG) 
          .show(); 
          break; 
          } 
          }
          @Override
          public String format(int value) {
          String tmpStr = String.valueOf(value); 
          if (value < 10) { 
          tmpStr = "0" + tmpStr; 
          } 
          return tmpStr;
          }
          @Override
          public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
          Toast.makeText(this, "值发生变化 ,原值: " + oldVal + " , 新值:"+ newVal, Toast.LENGTH_SHORT).show(); 
          }
}
        

注意 Activity需要用implements关键字实现以下接口 OnValueChangeListener, Formatter, OnScrollListener ,否则无法进行事件监听,例如本例:
public class NumberPickerActivity extends Activity implements OnValueChangeListener, Formatter, OnScrollListener
覆写完对应方法后需使用setFormatter(this),setOnValueChangedListener(this),setOnScrollListener(this)把相应事件设置到NumberPicker控件上。

本例通过两种方式获取NumberPicker上的值
(1)通过OnValueChangeListener监听事件可以同时获取原值和当前值
(2)在button的click事件中使用 numberPicker.getValue()这个方法获取当前值

NumberPicker主要方法整理如下:

NumberPicker.setFormatter(Formatter formatter)
格式化NumberPicker内部的数字
实现功能需要覆写format方法,格式public String format(int value),参数value是原数字,返回值是String类型的,详情参考本例代码。
NumberPicker.setOnValueChangedListener(OnValueChangeListener onValueChangedListener)
值变化监听事件
需要在内部重写onValueChange方法,格式如下:
public void onValueChange(NumberPicker picker, int oldVal, int newVal)
参数 picker 当前控件, oldVal变化之前的值,newVal改变后的新值(当前值)
NumberPicker.setOnScrollListener(OnScrollListener onScrollListener)
滑动状态变化监听事件,分为3种状态:
SCROLL_STATE_TOUCH_SCROLL:用户按下去然后滑动
SCROLL_STATE_FLING: 正在滑动中的状态
SCROLL_STATE_IDLE: NumberPicker停止滑动
NumberPicker.setMinValue(int minValue)
设置最小值
NumberPicker.setMaxValue(int maxValue)
设置最大值
NumberPicker.setValue(int value)
NumberPicker设置初始选定值,如果不设置此项NumberPicker初始状态默认选中最小值
NumberPicker.getValue()
获取当前选定值,返回值int类型
昵    称:
验证码:

相关文档:

Android控件
Android基础知识
Android组件
Android实例