(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
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
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://download.csdn.net/detail/barryhappy/4147857