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

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

Ответы [ 4 ]

52 голосов
/ 21 мая 2011

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

android:digits="abcdefghijklmnopqrstuvwxyz1234567890 "
16 голосов
/ 06 ноября 2012

Вот лучшее решение ......... 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});
5 голосов
/ 22 декабря 2015

Решение 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);
0 голосов
/ 21 мая 2011

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

textView.setInputType(InputType.TYPE_CLASS_NUMBER);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...