[Android] EditText設定只能輸入2位小數的探討

指間沙似流年發表於2017-12-23

一般情況下,我們在設定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) {
  }
});
複製程式碼

相關文章