(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;
- }
- }
- }
- 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);
- }
- };
- }
原文地址:点击打开链接