【发布时间】:2011-05-21 16:01:14
【问题描述】:
我的应用中有一个 TextView,我希望用户只能在其中输入字母数字字符。如何做到这一点?谢谢!
【问题讨论】:
标签: android validation textview
我的应用中有一个 TextView,我希望用户只能在其中输入字母数字字符。如何做到这一点?谢谢!
【问题讨论】:
标签: android validation textview
在 XML 中,这样写:
android:digits="abcdefghijklmnopqrstuvwxyz1234567890 "
【讨论】:
这里有一个更好的解决方案.........https://groups.google.com/forum/?fromgroups=#!topic/android-developers/hS9Xj3zFwZA
InputFilter filter = new InputFilter() {
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
for (int i = start; i < end; i++) {
if (!Character.isLetterOrDigit(source.charAt(i))) {
return "";
}
}
return null;
}
};
edit.setFilters(new InputFilter[]{filter});
【讨论】:
EditText 上设置了其他InputFilters。我已经发布了一个更完整的解决方案。
InputFilter 解决方案效果很好,让您可以完全控制以比android:digits 更精细的粒度级别过滤输入。如果所有字符都有效,filter() 方法应返回 null,如果某些字符无效,则应返回仅包含有效字符的 CharSequence。如果复制并粘贴了多个字符,其中一些字符无效,则应仅保留有效字符(如果任何字符无效,@AchJ 的解决方案将拒绝整个粘贴)。
public static class AlphaNumericInputFilter implements InputFilter {
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
// Only keep characters that are alphanumeric
StringBuilder builder = new StringBuilder();
for (int i = start; i < end; i++) {
char c = source.charAt(i);
if (Character.isLetterOrDigit(c)) {
builder.append(c);
}
}
// If all characters are valid, return null, otherwise only return the filtered characters
boolean allCharactersValid = (builder.length() == end - start);
return allCharactersValid ? null : builder.toString();
}
}
另外,在设置InputFilter 时,必须确保不要覆盖EditText 上设置的其他InputFilters;这些可以在 XML 中设置,例如android:maxLength。您还必须考虑设置InputFilters 的顺序。当与长度过滤器结合使用时,您的自定义过滤器应插入长度过滤器之前,这样粘贴的文本将在长度过滤器之前应用自定义过滤器(@AchJ 的解决方案将覆盖所有其他 InputFilters 并仅应用自定义过滤器) .
// Apply the filters to control the input (alphanumeric)
ArrayList<InputFilter> curInputFilters = new ArrayList<InputFilter>(Arrays.asList(editText.getFilters()));
curInputFilters.add(0, new AlphaNumericInputFilter());
InputFilter[] newInputFilters = curInputFilters.toArray(new InputFilter[curInputFilters.size()]);
editText.setFilters(newInputFilters);
【讨论】:
android:maxLength。 " 您的建议会覆盖任何其他 InputFilter,就像 @AchJ 的解决方案一样,这不是我们想要在这里做的。
这应该可行:
textView.setInputType(InputType.TYPE_CLASS_NUMBER);
【讨论】: