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

545 阅读1分钟

一般情况下,我们在设置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) {
  }
});