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

(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;
		}
	}
}
 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项目可在这下载: http://download.csdn.net/detail/barryhappy/4147857



  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值