EditText关于输入小数点的小问题

最近项目马上要上线了,有时间会尽量去整理所做的东西,不然下次做的时候,又要百度了。
今天主要说的是EditText的输入问题,看上出很简单吗,只需要在xml文件中声明inputType=”number/text/numberDecimal”,但是啊,即使你输入了numberDecimal,大约似乎editText中还是不能输入小数点,为什么呢?对不起啊,毕竟我也是小白,我也不清楚,但是找到一个方法啊:

editText.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL) ; 
editText.setKeyListener(new DigitsKeyListener(false, true)) ;

这个设置是可以的,但是这个DigitsKeyListener是个啥玩意儿呢?源码中解释为:As for all implementations of {@link KeyListener}, this class is only concerned with hardware keyboards. Software input methods have no obligation to trigger the methods in this class.英语不是很好,简单翻译一下: 是keyListener的一种实现,本类只与硬件输入发相关,相关的软件输入法是没有条件触发本类中的方法的。说的不是很明白,换句话说就是我们输入的时候,输入的DigitsKey(数字键)是归我们管的,其他的管不了(好吧原谅我四级永远都是424吧)。我们来看看这个DigitsKeyListener(false, true)是个什么意思:

public DigitsKeyListener(boolean sign, boolean decimal) {
        mSign = sign;
        mDecimal = decimal;

        int kind = (sign ? SIGN : 0) | (decimal ? DECIMAL : 0);
        mAccepted = CHARACTERS[kind];
    }

而我们CHARACTERS是一个final static 型的数组:

 private static final char[][] CHARACTERS = {
        { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' },
        { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '+' },
        { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.' },
        { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '+', '.' },
    };

主要到有个mAccepted 变量,不看源码只看名字就知道在键盘输入时可以接受的字符,那么我们这里需要接受小数点,那应该选CHARACTERS[2],来个逻辑算法即可啊。所以我想你应该明白了为啥sign和decimal需要填写false和true了吗?再者,如果我们不仅需要输入1-9.+-呢?

下面是我们的editText可以接受两个小数点的TextOnChangeListener:

import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;

public abstract class CustomTextWatcher implements TextWatcher {
        private boolean isChanged = false;
        EditText edt;

        public CustomTextWatcher(EditText edt) {
            super();
            this.edt = edt;
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        @Override
        public void afterTextChanged(Editable s) {
            if (isChanged) {// ----->如果字符未改变则返回
                return;
            }
            String str = s.toString();

            isChanged = true;
            String cuttedStr = str;
            boolean flag = false;
             /* 删除字符串中的dot */
            for (int i = str.length() - 1; i >= 0; i--) {
                char c = str.charAt(i);
                if ('.' == c && i <= str.length() - 3) {
                    cuttedStr = str.substring(0, i + 3);
                    if (cuttedStr.endsWith(".")) {
                        cuttedStr = cuttedStr.substring(0, i + 1);
                    }
                    flag = true;
                    break;
                }
            }
            if (flag) {
                edt.setText(cuttedStr);
            }

            edt.setSelection(edt.length());
            isChanged = false;
        }
    }

今晚就写到这了,有时间继续了啊。。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值