2025-05-25

(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

[java] view plaincopyprint?
package com.android.picker; 
 
import android.app.Dialog; 
import android.content.Context; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 
 
public class NumberPickerDialog extends Dialog implements OnClickListener { 
    Button btn_ok; 
    Button btn_cancel; 
    TextView txt_input; 
    TextView txt_rangeMin; 
    TextView txt_rangeMax; 
    Button btn_1; 
    Button btn_2; 
    Button btn_3; 
    Button btn_4; 
    Button btn_5; 
    Button btn_6; 
    Button btn_7; 
    Button btn_8; 
    Button btn_9; 
    Button btn_0; 
    Button btn_clear; 
    Button btn_dot; 
    Context context; 
    String initNumber; 
    int mode; 
 
    public interface OnMyNumberSetListener { 
        /**
         * 數字被設定之後執行此方法
         * 
         * @param number
         *            當前文字框中字符串
         * @param mode
         *            可用以標識調用者
         */ 
        void onNumberSet(String number, int mode); 
    } 
 
    private OnMyNumberSetListener mListener; 
 
    public NumberPickerDialog(Context context, OnMyNumberSetListener listener, 
            String number, int mode) { 
        super(context); 
        this.context = context; 
        this.mListener = listener; 
        this.initNumber = number; 
        this.mode = mode; 
    } 
 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.number_picker_layout); 
        setTitle("Number Picker"); 
 
        txt_input = (TextView) findViewById(R.id.txt_inputNumber); 
 
        txt_input.setText(String.valueOf(initNumber)); 
 
        btn_1 = (Button) findViewById(R.id.btn_1); 
        btn_2 = (Button) findViewById(R.id.btn_2); 
        btn_3 = (Button) findViewById(R.id.btn_3); 
        btn_4 = (Button) findViewById(R.id.btn_4); 
        btn_5 = (Button) findViewById(R.id.btn_5); 
        btn_6 = (Button) findViewById(R.id.btn_6); 
        btn_7 = (Button) findViewById(R.id.btn_7); 
        btn_8 = (Button) findViewById(R.id.btn_8); 
        btn_9 = (Button) findViewById(R.id.btn_9); 
        btn_0 = (Button) findViewById(R.id.btn_0); 
        btn_clear = (Button) findViewById(R.id.btn_clear); 
        btn_dot = (Button) findViewById(R.id.btn_dot); 
        btn_ok = (Button) findViewById(R.id.ok); 
        btn_cancel = (Button) findViewById(R.id.cancel); 
        btn_1.setOnClickListener(this); 
        btn_2.setOnClickListener(this); 
        btn_3.setOnClickListener(this); 
        btn_4.setOnClickListener(this); 
        btn_5.setOnClickListener(this); 
        btn_6.setOnClickListener(this); 
        btn_7.setOnClickListener(this); 
        btn_8.setOnClickListener(this); 
        btn_9.setOnClickListener(this); 
        btn_0.setOnClickListener(this); 
        btn_clear.setOnClickListener(this); 
        btn_dot.setOnClickListener(this); 
        btn_ok.setOnClickListener(this); 
        btn_cancel.setOnClickListener(this); 
        setCancelable(false); 
    } 
 
    private void setText(String num) { 
        String nowNumber = txt_input.getText().toString(); 
        String newNumber = ""; 
 
        /* 限制最多位數為8 */ 
        if (nowNumber.length() >= 8) { 
            return; 
        } 
 
        /* 限制為兩位小數 */ 
        int dotSite = nowNumber.indexOf("."); 
        if (dotSite > 0 && dotSite + 2 < nowNumber.length()) { 
            return; 
        } 
 
        if (!num.equals(".")) {// 輸入不為小數點  
            if (nowNumber.equals("") || nowNumber.equals("0")) { 
                newNumber = String.valueOf(num); 
            } else { 
                newNumber = nowNumber.concat(String.valueOf(num)); 
            } 
        } else {// 輸入小數點  
            if (nowNumber.equals("") || nowNumber.contains(".")) { 
                // 當前值為空或者已包含小數點時不執行操作  
                return; 
            } else { 
                newNumber = nowNumber.concat("."); 
            } 
        } 
        txt_input.setText(newNumber); 
    } 
 
    private void deleteText() { 
        txt_input.setText(""); 
    } 
 
    @Override 
    public void onClick(View v) { 
        switch (v.getId()) { 
        case R.id.ok: 
            String number = txt_input.getText().toString(); 
            if (number.endsWith(".")) { 
                number = number.substring(0, number.length() – 1); 
            } 
            mListener.onNumberSet(number, mode); 
            dismiss(); 
            break; 
        case R.id.cancel: 
            dismiss(); 
            break; 
        case R.id.btn_0: 
            setText("0"); 
            break; 
        case R.id.btn_1: 
            setText("1"); 
            break; 
        case R.id.btn_2: 
            setText("2"); 
            break; 
        case R.id.btn_3: 
            setText("3"); 
            break; 
        case R.id.btn_4: 
            setText("4"); 
            break; 
        case R.id.btn_5: 
            setText("5"); 
            break; 
        case R.id.btn_6: 
            setText("6"); 
            break; 
        case R.id.btn_7: 
            setText("7"); 
            break; 
        case R.id.btn_8: 
            setText("8"); 
            break; 
        case R.id.btn_9: 
            setText("9"); 
            break; 
        case R.id.btn_dot: 
            setText("."); 
            break; 
        case R.id.btn_clear: 
            deleteText(); 
            break; 
        } 
    } 

package com.android.picker;

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class NumberPickerDialog extends Dialog implements OnClickListener {
 Button btn_ok;
 Button btn_cancel;
 TextView txt_input;
 TextView txt_rangeMin;
 TextView txt_rangeMax;
 Button btn_1;
 Button btn_2;
 Button btn_3;
 Button btn_4;
 Button btn_5;
 Button btn_6;
 Button btn_7;
 Button btn_8;
 Button btn_9;
 Button btn_0;
 Button btn_clear;
 Button btn_dot;
 Context context;
 String initNumber;
 int mode;

 public interface OnMyNumberSetListener {
  /**
   * 數字被設定之後執行此方法
   *
   * @param number
   *            當前文字框中字符串
   * @param mode
   *            可用以標識調用者
   */
  void onNumberSet(String number, int mode);
 }

 private OnMyNumberSetListener mListener;

 public NumberPickerDialog(Context context, OnMyNumberSetListener listener,
   String number, int mode) {
  super(context);
  this.context = context;
  this.mListener = listener;
  this.initNumber = number;
  this.mode = mode;
 }

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.number_picker_layout);
  setTitle("Number Picker");

  txt_input = (TextView) findViewById(R.id.txt_inputNumber);

  txt_input.setText(String.valueOf(initNumber));

  btn_1 = (Button) findViewById(R.id.btn_1);
  btn_2 = (Button) findViewById(R.id.btn_2);
  btn_3 = (Button) findViewById(R.id.btn_3);
  btn_4 = (Button) findViewById(R.id.btn_4);
  btn_5 = (Button) findViewById(R.id.btn_5);
  btn_6 = (Button) findViewById(R.id.btn_6);
  btn_7 = (Button) findViewById(R.id.btn_7);
  btn_8 = (Button) findViewById(R.id.btn_8);
  btn_9 = (Button) findViewById(R.id.btn_9);
  btn_0 = (Button) findViewById(R.id.btn_0);
  btn_clear = (Button) findViewById(R.id.btn_clear);
  btn_dot = (Button) findViewById(R.id.btn_dot);
  btn_ok = (Button) findViewById(R.id.ok);
  btn_cancel = (Button) findViewById(R.id.cancel);
  btn_1.setOnClickListener(this);
  btn_2.setOnClickListener(this);
  btn_3.setOnClickListener(this);
  btn_4.setOnClickListener(this);
  btn_5.setOnClickListener(this);
  btn_6.setOnClickListener(this);
  btn_7.setOnClickListener(this);
  btn_8.setOnClickListener(this);
  btn_9.setOnClickListener(this);
  btn_0.setOnClickListener(this);
  btn_clear.setOnClickListener(this);
  btn_dot.setOnClickListener(this);
  btn_ok.setOnClickListener(this);
  btn_cancel.setOnClickListener(this);
  setCancelable(false);
 }

 private void setText(String num) {
  String nowNumber = txt_input.getText().toString();
  String newNumber = "";

  /* 限制最多位數為8 */
  if (nowNumber.length() >= 8) {
   return;
  }

  /* 限制為兩位小數 */
  int dotSite = nowNumber.indexOf(".");
  if (dotSite > 0 && dotSite + 2 < nowNumber.length()) {
   return;
  }

  if (!num.equals(".")) {// 輸入不為小數點
   if (nowNumber.equals("") || nowNumber.equals("0")) {
    newNumber = String.valueOf(num);
   } else {
    newNumber = nowNumber.concat(String.valueOf(num));
   }
  } else {// 輸入小數點
   if (nowNumber.equals("") || nowNumber.contains(".")) {
    // 當前值為空或者已包含小數點時不執行操作
    return;
   } else {
    newNumber = nowNumber.concat(".");
   }
  }
  txt_input.setText(newNumber);
 }

 private void deleteText() {
  txt_input.setText("");
 }

 @Override
 public void onClick(View v) {
  switch (v.getId()) {
  case R.id.ok:
   String number = txt_input.getText().toString();
   if (number.endsWith(".")) {
    number = number.substring(0, number.length() – 1);
   }
   mListener.onNumberSet(number, mode);
   dismiss();
   break;
  case R.id.cancel:
   dismiss();
   break;
  case R.id.btn_0:
   setText("0");
   break;
  case R.id.btn_1:
   setText("1");
   break;
  case R.id.btn_2:
   setText("2");
   break;
  case R.id.btn_3:
   setText("3");
   break;
  case R.id.btn_4:
   setText("4");
   break;
  case R.id.btn_5:
   setText("5");
   break;
  case R.id.btn_6:
   setText("6");
   break;
  case R.id.btn_7:
   setText("7");
   break;
  case R.id.btn_8:
   setText("8");
   break;
  case R.id.btn_9:
   setText("9");
   break;
  case R.id.btn_dot:
   setText(".");
   break;
  case R.id.btn_clear:
   deleteText();
   break;
  }
 }
}
 NumberPickerDemoActivity.java
[java] view plaincopyprint?
package com.android.picker; 
 
import com.android.picker.R; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
 
public class NumberPickerDemoActivity extends Activity { 
 
    private TextView textView1; 
    private Button button1; 
 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
 
        textView1 = (TextView) findViewById(R.id.text1); 
        button1 = (Button) findViewById(R.id.button1); 
        button1.setOnClickListener(new View.OnClickListener() { 
            public void onClick(View view) { 
                showNumberPicker(textView1.getText().toString(), 0); 
            } 
        }); 
    } 
 
    private void showNumberPicker(String number, int mode) { 
        String nowNumber = "0"; 
        if (!number.equals("")) { 
            nowNumber = number; 
        } 
        new NumberPickerDialog(this, listener, nowNumber, mode).show(); 
    } 
 
    private NumberPickerDialog.OnMyNumberSetListener listener = new NumberPickerDialog.OnMyNumberSetListener() { 
        @Override 
        public void onNumberSet(String number, int mode) { 
            textView1.setText(number); 
        } 
    }; 

package com.android.picker;

import com.android.picker.R;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class NumberPickerDemoActivity extends Activity {

 private TextView textView1;
 private Button button1;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  textView1 = (TextView) findViewById(R.id.text1);
  button1 = (Button) findViewById(R.id.button1);
  button1.setOnClickListener(new View.OnClickListener() {
   public void onClick(View view) {
    showNumberPicker(textView1.getText().toString(), 0);
   }
  });
 }

 private void showNumberPicker(String number, int mode) {
  String nowNumber = "0";
  if (!number.equals("")) {
   nowNumber = number;
  }
  new NumberPickerDialog(this, listener, nowNumber, mode).show();
 }

 private NumberPickerDialog.OnMyNumberSetListener listener = new NumberPickerDialog.OnMyNumberSetListener() {
  @Override
  public void onNumberSet(String number, int mode) {
   textView1.setText(number);
  }
 };
}xml比較多,就不貼瞭,完整的demo項目可在這下載:
http://up.aiwalls.com/2012/0317/20120317111812824.zip
 

 

摘自  狼的第二個小窩
 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *