自己的数字选择控件NumberPicker
Android3.0增加了一個(gè)NumberPicker類,可用于數(shù)字的獲取。但是目前我們的應(yīng)用一般都至少要兼容到2.1,所以要用NumberPicker就很糾結(jié)了。
我在寫的一個(gè)應(yīng)用要用到金錢的輸入,之前的做法是用一個(gè)EditText,限制內(nèi)容為數(shù)字,當(dāng)點(diǎn)擊時(shí)會(huì)調(diào)用系統(tǒng)默認(rèn)輸入法的數(shù)字鍵盤,但是總感覺有時(shí)候輸入法的界面看起來很突兀,跟程序的風(fēng)格不搭,于是萌生了自己寫一個(gè)數(shù)字輸入類的想法。
經(jīng)過google,發(fā)現(xiàn)了一個(gè)開源項(xiàng)目http://code.google.com/p/taketoma-android-number-picker/,經(jīng)過修改,實(shí)現(xiàn)了自己想要的功能。
在NumberPickerDialog的setText方法中可以很方便的修改限制條件,使其符合各種要求,如原版的代碼就是對(duì)最大值和最小值的限定。另外原版的代碼限制為整數(shù),我修改成了String,以使其更靈活一些。
我修改后的代碼demo——
?
運(yùn)行效果圖:
?
功能類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 {
/**
* 數(shù)字被設(shè)定之后執(zhí)行此方法
*
* @param number
* 當(dāng)前文字框中字符串
* @param mode
* 可用以標(biāo)識(shí)調(diào)用者
*/
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 = "";
/* 限制最多位數(shù)為8 */
if (nowNumber.length() >= 8) {
return;
}
/* 限制為兩位小數(shù) */
int dotSite = nowNumber.indexOf(".");
if (dotSite > 0 && dotSite + 2 < nowNumber.length()) {
return;
}
if (!num.equals(".")) {// 輸入不為小數(shù)點(diǎn)
if (nowNumber.equals("") || nowNumber.equals("0")) {
newNumber = String.valueOf(num);
} else {
newNumber = nowNumber.concat(String.valueOf(num));
}
} else {// 輸入小數(shù)點(diǎn)
if (nowNumber.equals("") || nowNumber.contains(".")) {
// 當(dāng)前值為空或者已包含小數(shù)點(diǎn)時(shí)不執(zhí)行操作
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項(xiàng)目可在這下載:http://files.cnblogs.com/shanzei/_NumberPickerDemo.zip
原文:http://blog.csdn.net/barryhappy/article/details/7363230#
轉(zhuǎn)載于:https://www.cnblogs.com/shanzei/archive/2012/04/06/2434708.html
總結(jié)
以上是生活随笔為你收集整理的自己的数字选择控件NumberPicker的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ajax搜索结果页面下方的分页按钮的生成
- 下一篇: ASP.NET MVC系列:UrlRou