繼承自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;
- }
- }
- }
- 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);
- }
- };
- }
相關文章
- 類的繼承_子類繼承父類繼承
- 類的繼承繼承
- 20200109 - 類的繼承繼承
- Python類的繼承Python繼承
- C#類繼承自泛型集合C#繼承泛型
- abstract關鍵字 super 關鍵字 類與繼承繼承
- 類的繼承和派生繼承
- 【Python】python類的繼承Python繼承
- 類的繼承圖解繼承圖解
- PHP 抽象類繼承抽象類時的注意點PHP 抽象類繼承抽象類時的注意點PHP抽象繼承
- C++ | 類繼承C++繼承
- 原型繼承:子類原型繼承
- TypeScript 介面繼承類TypeScript繼承
- 類的繼承,介面的使用繼承
- 繼承 基類與派生類繼承
- Kotlin學習快速入門(3)——類 繼承 介面Kotlin繼承
- input 輸入框只能輸入數字
- es5繼承和es6類和繼承繼承
- odoo 繼承(owl繼承、web繼承、view繼承)Odoo繼承WebView
- TypeScript入門2:類、繼承、訪問修飾符TypeScript繼承
- 類的組合、繼承、模板類、標準庫繼承
- Java中的類繼承與多型Java繼承多型
- 類的組合與繼承——作業繼承
- js 原型鏈實現類的繼承JS原型繼承
- 深入理解JavaScript中的類繼承JavaScript繼承
- es6類的繼承淺析繼承
- 類别範本與繼承繼承
- JavaSE-繼承(包含Object類)Java繼承Object
- 菱形繼承與虛基類繼承
- TypeScript(5)類、繼承、多型TypeScript繼承多型
- 物件、原型鏈、類、繼承【上】物件原型繼承
- python_類繼承例題Python繼承
- Java之繼承和抽象類Java繼承抽象
- Kotlin之類繼承結構Kotlin繼承
- ES6 - 類與繼承繼承
- JavaScript基礎: 類與繼承JavaScript繼承
- Vue只能輸入數字Vue
- ES6中的類繼承和ES5中的繼承模式詳解繼承模式
- Javascript繼承4:潔淨的繼承者—-原型式繼承JavaScript繼承原型