數字選擇器NumberPicker是Android3.0之後引入的一個控件,比較常用,比如說手機常用的鬧鐘,可以選擇小時和分鐘,如果你需要相容3.0之前版本,GitHub上有開源的項目,具體的下載下傳位址https://github.com/SimonVT/android-numberpicker。本人就沒有使用開源的項目,就簡單的使用了NumberPicker顯示一下效果,開始正題吧:
開發東西先看下效果吧:

NumberPicker和TextView顯示一下時間,線性布局,看下布局檔案吧:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<code><LinearLayout xmlns:android=</code><code>"http://schemas.android.com/apk/res/android"</code>
<code> </code><code>xmlns:tools=</code><code>"http://schemas.android.com/tools"</code>
<code> </code><code>android:layout_width=</code><code>"fill_parent"</code>
<code> </code><code>android:layout_height=</code><code>"wrap_content"</code>
<code> </code><code>android:orientation=</code><code>"vertical"</code>
<code> </code><code>tools:context=</code><code>"com.example.googlenumberpicker.MainActivity"</code> <code>></code>
<code> </code><code><LinearLayout</code>
<code> </code><code>android:layout_width=</code><code>"fill_parent"</code>
<code> </code><code>android:layout_height=</code><code>"wrap_content"</code>
<code> </code><code>android:layout_marginTop=</code><code>"30dp"</code>
<code> </code><code>android:layout_marginLeft=</code><code>"50dp"</code>
<code> </code><code>android:layout_gravity=</code><code>"center_horizontal"</code> <code>></code>
<code> </code><code><NumberPicker</code>
<code> </code><code>android:id=</code><code>"@+id/hourpicker"</code>
<code> </code><code>android:layout_width=</code><code>"40dp"</code>
<code> </code><code>android:layout_height=</code><code>"wrap_content"</code> <code>/></code>
<code> </code><code><TextView</code>
<code> </code><code>android:layout_width=</code><code>"wrap_content"</code>
<code> </code><code>android:layout_height=</code><code>"wrap_content"</code>
<code> </code><code>android:layout_gravity=</code><code>"center_vertical"</code>
<code> </code><code>android:text=</code><code>"時"</code> <code>/></code>
<code> </code><code>android:id=</code><code>"@+id/minuteicker"</code>
<code> </code><code>android:text=</code><code>"分"</code> <code>/></code>
<code> </code><code></LinearLayout></code>
<code></LinearLayout></code>
數字選擇是可以滑動,是以需要定義一個OnValueChangeListener事件,OnScrollListener滑動事件,Formatter事件:
Formatter事件:
<code>public</code> <code>String format(</code><code>int</code> <code>value) {</code>
<code> </code><code>String tmpStr = String.valueOf(value);</code>
<code> </code><code>if</code> <code>(value < </code><code>10</code><code>) {</code>
<code> </code><code>tmpStr = </code><code>"0"</code> <code>+ tmpStr;</code>
<code> </code><code>}</code>
<code> </code><code>return</code> <code>tmpStr;</code>
<code> </code><code>}</code>
OnValueChangeListener事件:
<code>public</code> <code>void</code> <code>onValueChange(NumberPicker picker, </code><code>int</code> <code>oldVal, </code><code>int</code> <code>newVal) {</code>
<code> </code><code>Toast.makeText(</code>
<code> </code><code>this</code><code>,</code>
<code> </code><code>"原來的值 "</code> <code>+ oldVal + </code><code>"--新值: "</code>
<code> </code><code>+ newVal, Toast.LENGTH_SHORT).show();</code>
<code> </code><code>}</code>
OnScrollListener滑動事件,滑動事件有三個狀态:
SCROLL_STATE_FLING:手離開之後還在滑動
SCROLL_STATE_IDLE:不滑動
SCROLL_STATE_TOUCH_SCROLL:滑動中
<code>public</code> <code>void</code> <code>onScrollStateChange(NumberPicker view, </code><code>int</code> <code>scrollState) {</code>
<code> </code><code>switch</code> <code>(scrollState) {</code>
<code> </code><code>case</code> <code>OnScrollListener.SCROLL_STATE_FLING:</code>
<code> </code><code>Toast.makeText(</code><code>this</code><code>, </code><code>"後續滑動(飛呀飛,根本停下來)"</code><code>, Toast.LENGTH_LONG)</code>
<code> </code><code>.show();</code>
<code> </code><code>break</code><code>;</code>
<code> </code><code>case</code> <code>OnScrollListener.SCROLL_STATE_IDLE:</code>
<code> </code><code>Toast.makeText(</code><code>this</code><code>, </code><code>"不滑動"</code><code>, Toast.LENGTH_LONG).show();</code>
<code> </code><code>case</code> <code>OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:</code>
<code> </code><code>Toast.makeText(</code><code>this</code><code>, </code><code>"滑動中"</code><code>, Toast.LENGTH_LONG)</code>
<code> </code><code>}</code>
初始化:
<code>hourPicker=(NumberPicker) findViewById(R.id.hourpicker);</code>
<code> </code><code>minutePicker=(NumberPicker) findViewById(R.id.minuteicker);</code>
<code> </code><code>init();</code>
init方法中,設定數字的最大值,最小值,以及滑動事件:
<code>private</code> <code>void</code> <code>init() {</code>
<code> </code><code>hourPicker.setFormatter(</code><code>this</code><code>);</code>
<code> </code><code>hourPicker.setOnValueChangedListener(</code><code>this</code><code>);</code>
<code> </code><code>hourPicker.setOnScrollListener(</code><code>this</code><code>);</code>
<code> </code><code>hourPicker.setMaxValue(</code><code>24</code><code>);</code>
<code> </code><code>hourPicker.setMinValue(</code><code>0</code><code>);</code>
<code> </code><code>hourPicker.setValue(</code><code>9</code><code>);</code>
<code> </code>
<code> </code><code>minutePicker.setFormatter(</code><code>this</code><code>);</code>
<code> </code><code>minutePicker.setOnValueChangedListener(</code><code>this</code><code>);</code>
<code> </code><code>minutePicker.setOnScrollListener(</code><code>this</code><code>);</code>
<code> </code><code>minutePicker.setMaxValue(</code><code>60</code><code>);</code>
<code> </code><code>minutePicker.setMinValue(</code><code>0</code><code>);</code>
<code> </code><code>minutePicker.setValue(</code><code>49</code><code>);</code>
<code> </code><code>}</code>
還差一步,Activity需要繼承一下OnValueChangeListener,OnScrollListener,Formatter:
<code>public</code> <code>class</code> <code>MainActivity </code><code>extends</code> <code>Activity </code><code>implements</code> <code>OnValueChangeListener,OnScrollListener,Formatter{...}</code>
最後說一點就是NumberPicker也是可以顯示文字的,重新定義一個NumberPicker,加載一下:
<code>valuepicker = (NumberPicker) findViewById(R.id.valuepicker);</code>
<code> </code><code>String[] city = {</code><code>"立水橋"</code><code>,</code><code>"霍營"</code><code>,</code><code>"回龍觀"</code><code>,</code><code>"龍澤"</code><code>,</code><code>"西二旗"</code><code>,</code><code>"上地"</code><code>};</code>
<code> </code><code>valuepicker.setDisplayedValues(city);</code>
<code> </code><code>valuepicker.setMinValue(</code><code>0</code><code>);</code>
<code> </code><code>valuepicker.setMaxValue(city.length - </code><code>1</code><code>);</code>
<code> </code><code>valuepicker.setValue(</code><code>4</code><code>);</code>
最後顯示的效果:
本文轉自Fly_Elephant部落格園部落格,原文連結:http://www.cnblogs.com/xiaofeixiang/p/4125560.html,如需轉載請自行聯系原作者