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