我正在尝试将InputFilter添加到我的EditText中,它必须只允许整数或只有一个小数点的十进制数字。
接受的输入必须是:
1 - 12 - 3.33 - 4.20 etc.
拒绝:
.0 - 5. - 5.5.5 - 40.21.1 etc.
我创建了一个自定义的InputFilter,它检查RegExp^d+(.d+)?$
之后的输入是否匹配
但是EditText总是显示一个空字符串;"跨度";始终为空,而默认情况下EditText具有起始值。
过滤器:
public class DecimalDigitsFilter implements InputFilter {
@Override
public CharSequence filter(CharSequence charSequence, int i, int i1, Spanned spanned, int i2, int i3) {
Pattern pattern = Pattern.compile("^\d+(\.\d+)?$");
Matcher matcher = pattern.matcher(spanned);
if (!matcher.matches()){
return "";
}
return null;
}
}
活动:
quantita.setFilters(new InputFilter[] {new DecimalDigitsFilter()});
您需要针对EditText
:中的实际文本运行匹配器
public class DecimalDigitsFilter implements InputFilter {
@Override
public CharSequence filter(CharSequence charSequence, int i, int i1, Spanned spanned, int i2, int i3) {
Pattern pattern = Pattern.compile("^\d+(\.\d+)?$");
Matcher matcher = pattern.matcher(spanned.getText());
if (!matcher.matches()){
return "";
}
return null;
}
}
我不得不在TextChangedListener
中移动mo逻辑,因为在InputFilter
中,我无法将整个字符串放在哪里检查我的RegExp。
此外,我甚至不得不像这样更改我的RegExp^d+(.([d+]+)?)?$
,我必须将小数点后的值设置为可选项,否则每次我写小数点时,.matches()
都会失败。
所以最后的代码看起来是这样的:
quantita.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
Pattern pattern = Pattern.compile("^\d+(\.([\d+]+)?)?$");
Matcher matcher = pattern.matcher(quantita.getText().toString());
if (!matcher.matches()){
quantita.setText("");
}
}
});