如何限制EditText仅接受字母数字字符,以便无论用户键入哪个小写或大写键,EditText都将显示大写
解决方案是使用InputFilter,它可以让您在比android:digits更细的粒度级别上完全控制筛选输入。如果所有字符都有效,则filter()方法应返回null;如果某些字符无效,则应返回只包含有效字符的CharSequence。如果复制并粘贴了多个字符,并且其中一些字符无效,则只保留有效字符。
public static class AlphaNumericInputFilter implements InputFilter {
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
StringBuilder builder = new StringBuilder();
for (int i = start; i < end; i++) {
char c = source.charAt(i);
if (Character.isLetterOrDigit(c)) {
builder.append(c);
}
}
boolean allCharactersValid = (builder.length() == end - start);
return allCharactersValid ? null : builder.toString();
}
}
此外,在设置InputFilter
时,您必须确保不覆盖在EditText
上设置的其他InputFilters
;这些可能是在XML中设置的,例如android:maxLength
。您还必须考虑设置InputFilters
的顺序,它们会按照设置的顺序应用。幸运的是,InputFilter.AllCaps
已经存在,因此将其应用于我们的字母数字过滤器将保留所有字母数字文本,并将其转换为大写。
ArrayList<InputFilter> curInputFilters = new ArrayList<InputFilter>(Arrays.asList(editText.getFilters()));
curInputFilters.add(0, new AlphaNumericInputFilter());
curInputFilters.add(1, new InputFilter.AllCaps());
InputFilter[] newInputFilters = curInputFilters.toArray(new InputFilter[curInputFilters.size()]);
editText.setFilters(newInputFilters);