[Android] EditText设置只能输入2位小数的探讨

本文介绍如何使用Android的EditText控件限制用户仅能输入小数,并控制输入的小数位数。通过自定义DigitsKeyListener实现对输入字符的过滤,确保用户不能输入除数字和小数点以外的其他字符。

一般情况下,我们在设置edittext的输入限定小数的时候使用的是

android:inputType="numberDecimal"
or
et.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL);

但是有的时候会出现能输入符号和字母的情况

我们可以通过另外一种思路,控制键盘的输入,来控制只能输入小数和.

通过EditText的setKeyListener方法,来过滤输入的字符和输入类型

et.setKeyListener(new NumberKeyListener() {
    @Override
    public int getInputType() {
        return InputType.TYPE_TEXT_VARIATION_PASSWORD;
    }

    @Override
    protected char[] getAcceptedChars() {
        String digists = "1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
        char[] data = digists.toCharArray();
        return data;
    }
});

再通过源码会发现一个新的监听类DigitsKeyListener,这个类继承了NumberKeyListener,只接受数字和.``+``-

  1. 默认为只接受数字

    public DigitsKeyListener() {
        this(false, false);
    }
  2. 通过设置可以设置输入源:

    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', '-', '+', '.' },
    };
    
    public DigitsKeyListener(boolean sign, boolean decimal) {
        mSign = sign;
        mDecimal = decimal;
    
        int kind = (sign ? SIGN : 0) | (decimal ? DECIMAL : 0);
        mAccepted = CHARACTERS[kind];
    }
  3. 设置

    • et.setKeyListener(new DigitsKeyListener()) 设置只能数字
    • et.setKeyListener(new DigitsKeyListener(false, true)) 设置只能数字和一个.
    • et.setKeyListener(new DigitsKeyListener(true, false)) 设置只能数字和+``-
    • et.setKeyListener(new DigitsKeyListener(false, false)) 设置只能数字和+``-``.

这样我们就能控制输入,达到只能输入小数和.的效果,然后在通过

et.addTextChangedListener(new TextWatcher() {

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

  @Override
  public void onTextChanged(CharSequence s, int start, int before, int count) {
    String text = s.toString();  
    if (text.contains(".")) {  
        int index = text.indexOf(".");  
        if (index + 3 < text.length()) {  
            text = text.substring(0, index + 3);  
            et.setText(text);  
            et.setSelection(text.length());  
        }  
    } 
  }

  @Override
  public void afterTextChanged(Editable s) {
  }
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值