Как ограничить TextView, чтобы разрешать только буквенно-цифровые символы в Android

#android #validation #textview

#Android #валидация #textview

Вопрос:

В моем приложении есть TextView, в котором я хочу, чтобы пользователь мог вводить только буквенно-цифровые символы. Как это можно сделать? Спасибо!

Ответ №1:

В XML поместите это:

 android:digits="abcdefghijklmnopqrstuvwxyz1234567890 "
  

Комментарии:

1. Wow Android делает это так просто. iOS требуется в 1000 раз больше усилий для достижения той же функциональности.

2. Я использовал этот метод для буквенно-цифрового Android: digits =»abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ», но Samsung Galaxy y pro столкнулся с проблемой, из-за которой не разрешен символ верхнего регистра (E, R, T, D, F, G, X, C, V), содержащий цифры.

3. Разве это решение не было бы ограничено только английским языком? Для этого можно было бы использовать что-то вроде @string / digits , но это кажется серьезной проблемой для каждого языка.

Ответ №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});
  

Комментарии:

1. Гораздо лучшее решение, разрешив заглавные буквы.

2. Это решение работает для простых случаев ввода отдельных символов, но неправильно обрабатывает копирование и вставку, или когда в InputFilters заданы другие EditText значения.. Я опубликовал более полное решение.

Ответ №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);
  

Комментарии:

1. чтобы упростить setFilters, я бы сделал: EditText.setFilters(новый входной фильтр[]{новый CurrencyFormatInputFilter()});

2. @Rocel пожалуйста, внимательно прочитайте мое объяснение: » вы должны убедиться, что не перезаписываете другие входные фильтры, установленные в вашем EditText; они могут быть установлены в XML, например android:maxLength . » Ваше предложение перезаписало бы любое другое InputFilter , точно так же, как решение @AchJ, которое не является тем, что мы хотим здесь сделать.

Ответ №4:

Это должно сработать:

 textView.setInputType(InputType.TYPE_CLASS_NUMBER);