(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
摘自 狼的第二個小窩