繼承自NumberPicker的數字輸入類

yangxi_001發表於2014-08-29

(PS:其實不是自己的,只是我修改自別人的開原始碼的,這裡說“自己的”只是為了區別Android3.0以後系統自帶的NumberPicker類)

Android3.0增加了一個NumberPicker類,可用於數字的獲取。但是目前我們的應用一般都至少要相容到2.1,所以要用NumberPicker就很糾結了。

我在寫的一個應用要用到金錢的輸入,之前的做法是用一個EditText,限制內容為數字,當點選時會呼叫系統預設輸入法的數字鍵盤,但是總感覺有時候輸入法的介面看起來很突兀,跟程式的風格不搭,於是萌生了自己寫一個數字輸入類的想法。

經過google,發現了一個開源專案http://code.google.com/p/taketoma-android-number-picker/,經過修改,實現了自己想要的功能。


在NumberPickerDialog的setText方法中可以很方便的修改限制條件,使其符合各種要求,如原版的程式碼就是對最大值和最小值的限定。另外原版的程式碼限制為整數,我修改成了String,以使其更靈活一些。


我修改後的程式碼demo——

執行效果圖:


功能類NumberPickerDialog.java

  1. package com.android.picker;  
  2.   
  3. import android.app.Dialog;  
  4. import android.content.Context;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Button;  
  9. import android.widget.TextView;  
  10.   
  11. public class NumberPickerDialog extends Dialog implements OnClickListener {  
  12.     Button btn_ok;  
  13.     Button btn_cancel;  
  14.     TextView txt_input;  
  15.     TextView txt_rangeMin;  
  16.     TextView txt_rangeMax;  
  17.     Button btn_1;  
  18.     Button btn_2;  
  19.     Button btn_3;  
  20.     Button btn_4;  
  21.     Button btn_5;  
  22.     Button btn_6;  
  23.     Button btn_7;  
  24.     Button btn_8;  
  25.     Button btn_9;  
  26.     Button btn_0;  
  27.     Button btn_clear;  
  28.     Button btn_dot;  
  29.     Context context;  
  30.     String initNumber;  
  31.     int mode;  
  32.   
  33.     public interface OnMyNumberSetListener {  
  34.         /** 
  35.          * 數字被設定之後執行此方法 
  36.          *  
  37.          * @param number 
  38.          *            當前文字框中字串 
  39.          * @param mode 
  40.          *            可用以標識呼叫者 
  41.          */  
  42.         void onNumberSet(String number, int mode);  
  43.     }  
  44.   
  45.     private OnMyNumberSetListener mListener;  
  46.   
  47.     public NumberPickerDialog(Context context, OnMyNumberSetListener listener,  
  48.             String number, int mode) {  
  49.         super(context);  
  50.         this.context = context;  
  51.         this.mListener = listener;  
  52.         this.initNumber = number;  
  53.         this.mode = mode;  
  54.     }  
  55.   
  56.     @Override  
  57.     protected void onCreate(Bundle savedInstanceState) {  
  58.         super.onCreate(savedInstanceState);  
  59.         setContentView(R.layout.number_picker_layout);  
  60.         setTitle("Number Picker");  
  61.   
  62.         txt_input = (TextView) findViewById(R.id.txt_inputNumber);  
  63.   
  64.         txt_input.setText(String.valueOf(initNumber));  
  65.   
  66.         btn_1 = (Button) findViewById(R.id.btn_1);  
  67.         btn_2 = (Button) findViewById(R.id.btn_2);  
  68.         btn_3 = (Button) findViewById(R.id.btn_3);  
  69.         btn_4 = (Button) findViewById(R.id.btn_4);  
  70.         btn_5 = (Button) findViewById(R.id.btn_5);  
  71.         btn_6 = (Button) findViewById(R.id.btn_6);  
  72.         btn_7 = (Button) findViewById(R.id.btn_7);  
  73.         btn_8 = (Button) findViewById(R.id.btn_8);  
  74.         btn_9 = (Button) findViewById(R.id.btn_9);  
  75.         btn_0 = (Button) findViewById(R.id.btn_0);  
  76.         btn_clear = (Button) findViewById(R.id.btn_clear);  
  77.         btn_dot = (Button) findViewById(R.id.btn_dot);  
  78.         btn_ok = (Button) findViewById(R.id.ok);  
  79.         btn_cancel = (Button) findViewById(R.id.cancel);  
  80.         btn_1.setOnClickListener(this);  
  81.         btn_2.setOnClickListener(this);  
  82.         btn_3.setOnClickListener(this);  
  83.         btn_4.setOnClickListener(this);  
  84.         btn_5.setOnClickListener(this);  
  85.         btn_6.setOnClickListener(this);  
  86.         btn_7.setOnClickListener(this);  
  87.         btn_8.setOnClickListener(this);  
  88.         btn_9.setOnClickListener(this);  
  89.         btn_0.setOnClickListener(this);  
  90.         btn_clear.setOnClickListener(this);  
  91.         btn_dot.setOnClickListener(this);  
  92.         btn_ok.setOnClickListener(this);  
  93.         btn_cancel.setOnClickListener(this);  
  94.         setCancelable(false);  
  95.     }  
  96.   
  97.     private void setText(String num) {  
  98.         String nowNumber = txt_input.getText().toString();  
  99.         String newNumber = "";  
  100.   
  101.         /* 限制最多位數為8 */  
  102.         if (nowNumber.length() >= 8) {  
  103.             return;  
  104.         }  
  105.   
  106.         /* 限制為兩位小數 */  
  107.         int dotSite = nowNumber.indexOf(".");  
  108.         if (dotSite > 0 && dotSite + 2 < nowNumber.length()) {  
  109.             return;  
  110.         }  
  111.   
  112.         if (!num.equals(".")) {// 輸入不為小數點  
  113.             if (nowNumber.equals("") || nowNumber.equals("0")) {  
  114.                 newNumber = String.valueOf(num);  
  115.             } else {  
  116.                 newNumber = nowNumber.concat(String.valueOf(num));  
  117.             }  
  118.         } else {// 輸入小數點  
  119.             if (nowNumber.equals("") || nowNumber.contains(".")) {  
  120.                 // 當前值為空或者已包含小數點時不執行操作  
  121.                 return;  
  122.             } else {  
  123.                 newNumber = nowNumber.concat(".");  
  124.             }  
  125.         }  
  126.         txt_input.setText(newNumber);  
  127.     }  
  128.   
  129.     private void deleteText() {  
  130.         txt_input.setText("");  
  131.     }  
  132.   
  133.     @Override  
  134.     public void onClick(View v) {  
  135.         switch (v.getId()) {  
  136.         case R.id.ok:  
  137.             String number = txt_input.getText().toString();  
  138.             if (number.endsWith(".")) {  
  139.                 number = number.substring(0, number.length() - 1);  
  140.             }  
  141.             mListener.onNumberSet(number, mode);  
  142.             dismiss();  
  143.             break;  
  144.         case R.id.cancel:  
  145.             dismiss();  
  146.             break;  
  147.         case R.id.btn_0:  
  148.             setText("0");  
  149.             break;  
  150.         case R.id.btn_1:  
  151.             setText("1");  
  152.             break;  
  153.         case R.id.btn_2:  
  154.             setText("2");  
  155.             break;  
  156.         case R.id.btn_3:  
  157.             setText("3");  
  158.             break;  
  159.         case R.id.btn_4:  
  160.             setText("4");  
  161.             break;  
  162.         case R.id.btn_5:  
  163.             setText("5");  
  164.             break;  
  165.         case R.id.btn_6:  
  166.             setText("6");  
  167.             break;  
  168.         case R.id.btn_7:  
  169.             setText("7");  
  170.             break;  
  171.         case R.id.btn_8:  
  172.             setText("8");  
  173.             break;  
  174.         case R.id.btn_9:  
  175.             setText("9");  
  176.             break;  
  177.         case R.id.btn_dot:  
  178.             setText(".");  
  179.             break;  
  180.         case R.id.btn_clear:  
  181.             deleteText();  
  182.             break;  
  183.         }  
  184.     }  
  185. }  
 NumberPickerDemoActivity.java
  1. package com.android.picker;  
  2.   
  3. import com.android.picker.R;  
  4. import android.app.Activity;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.widget.Button;  
  8. import android.widget.TextView;  
  9.   
  10. public class NumberPickerDemoActivity extends Activity {  
  11.   
  12.     private TextView textView1;  
  13.     private Button button1;  
  14.   
  15.     @Override  
  16.     public void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(R.layout.main);  
  19.   
  20.         textView1 = (TextView) findViewById(R.id.text1);  
  21.         button1 = (Button) findViewById(R.id.button1);  
  22.         button1.setOnClickListener(new View.OnClickListener() {  
  23.             public void onClick(View view) {  
  24.                 showNumberPicker(textView1.getText().toString(), 0);  
  25.             }  
  26.         });  
  27.     }  
  28.   
  29.     private void showNumberPicker(String number, int mode) {  
  30.         String nowNumber = "0";  
  31.         if (!number.equals("")) {  
  32.             nowNumber = number;  
  33.         }  
  34.         new NumberPickerDialog(this, listener, nowNumber, mode).show();  
  35.     }  
  36.   
  37.     private NumberPickerDialog.OnMyNumberSetListener listener = new NumberPickerDialog.OnMyNumberSetListener() {  
  38.         @Override  
  39.         public void onNumberSet(String number, int mode) {  
  40.             textView1.setText(number);  
  41.         }  
  42.     };  
  43. }  
xml比較多,就不貼了,完整的demo專案可在這下載:http://download.csdn.net/detail/barryhappy/4147857


相關文章