zoukankan      html  css  js  c++  java
  • 自己的数字选择控件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项目可在这下载:https://files.cnblogs.com/shanzei/_NumberPickerDemo.zip

    原文:http://blog.csdn.net/barryhappy/article/details/7363230#

  • 相关阅读:
    函数概述
    Python之购物车实战(练习字典、random函数)
    字典方法
    dict字典练习题
    触发器(游标)给同事老朱写
    SQL之游标实例
    SQL之游标
    Python之for循环之range函数和enumerate函数
    python之购物车(详解list tupe 循环)
    第二周 数据获取与表示 第二节 数据表示 Data representation
  • 原文地址:https://www.cnblogs.com/shanzei/p/2434708.html
Copyright © 2011-2022 走看看