灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:3458回复:0

我的Android笔记(六)——分享一个自己的NumberPicker

楼主#
更多 发布于:2012-09-06 13:45

(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项目可在这下载:

资源:
115网盘附件下载:
代码.zip (120.18KB)


喜欢0 评分0
游客

返回顶部