У меня есть TextView в моем приложении, что я хочу, чтобы пользователь мог вводить только буквенно-цифровые символы. Как это можно сделать? Спасибо!
Как запретить TextView разрешать только буквенно-цифровые символы в Android
Ответ 1
В XML, поставьте это:
android:digits="abcdefghijklmnopqrstuvwxyz1234567890 "
Ответ 2
Вот лучшее решение......... 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});
Ответ 3
Решение 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
вы должны не перезаписывать другие InputFilters
, установленные на EditText
; они могут быть установлены в 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);
Ответ 4
Это должно работать:
textView.setInputType(InputType.TYPE_CLASS_NUMBER);