一般情況下,我們在設定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
,只接受數字和.``+``-
-
預設為只接受數字
public DigitsKeyListener() { this(false, false); } 複製程式碼
-
通過設定可以設定輸入源:
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]; } 複製程式碼
-
設定
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) {
}
});
複製程式碼