自己的数字选择控件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项目可在这下载:https://files.cnblogs.com/shanzei/_NumberPickerDemo.zip

原文:http://blog.csdn.net/barryhappy/article/details/7363230#

原文地址:https://www.cnblogs.com/shanzei/p/2434708.html