Как ограничить EditText, чтобы принимать только буквенно-цифровые символы

Как я могу ограничить EditText принимать только буквенно-цифровые символы, причем как строчные, так и прописные символы, обозначенные как верхний регистр в EditText?

<EditText
    android:id="@+id/userInput"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:inputType="textMultiLine"
    android:minLines="3" >

    <requestFocus />
</EditText>

Если пользователь вводит строчный "abcd", EditText должен автоматически отображать верхний регистр "ABCD" без необходимости ограничивать клавиатуру в верхнем регистре.

Ответы

Ответ 1

В XML добавьте следующее:

 android:digits="abcdefghijklmnopqrstuvwxyz1234567890 "

Ответ 2

Как ограничить 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) {

        // 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, они применяются в этом порядке. К счастью, InputFilter.AllCaps уже существует, поэтому при использовании нашего алфавитно-цифрового фильтра будет сохраняться весь буквенно-цифровой текст и преобразовать его в верхний регистр.

    // Apply the filters to control the input (alphanumeric)
    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);

Ответ 3

Используйте это:

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
android:inputType="textCapCharacters"

Я попытался использовать textAllCaps="true", как это было предложено в комментарии к принятому ответу на этот вопрос, но он не работал должным образом.

Ответ 4

Если вам не нужна большая часть настроек, простой трюк на самом деле из вышеперечисленного со всеми символами, которые вы хотите добавить в android: цифры

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"

Это должно работать, чтобы принимать буквенно-цифровые значения с помощью Caps и Small letters.

Ответ 5

попробуйте это:

private void addFilterToUserName()
    {

        sign_up_display_name_et.setFilters(new InputFilter[] {
                new InputFilter() {
                    public CharSequence filter(CharSequence src, int start,
                                               int end, Spanned dst, int dstart, int dend) {
                        if(src.equals("")){ // for backspace
                            return src;
                        }
                        if(src.toString().matches("[a-zA-Z 0-9]+")){
                            return src;
                        }
                        return "";
                    }
                }
        });
    }

Ответ 6

Это работает для меня:

android:inputType="textVisiblePassword"

Ответ 7

Вы не хотите писать какое-либо регулярное выражение для этого, вы можете просто добавить свойства XML в свой текст редактирования

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
android:inputType="textCapCharacters"

Протестировано отлично работает для проверки карты PAN.

Ответ 8

Для этого вам нужно создать свой собственный фильтр и установить в свой EditText, как это.

Это автоматически преобразует ваши алфавиты в верхний регистр.

EditText editText = (EditText)findViewById(R.id.userInput);
InputFilter myFilter = new InputFilter() {

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        try {
            Character c = source.charAt(0);
            if (Character.isLetter(c) || Character.isDigit(c)) {
                return "" + Character.toUpperCase(c);
            } else {
                return "";
            }
        } catch (Exception e) {
        }
        return null;
    }
};
editText.setFilters(new InputFilter[] { myFilter });

Нет дополнительных параметров для установки в xml файле.

Ответ 9

один ответ строки

сделать это onCreate

для нижнего регистра и верхнего регистра с разрешающим пространством

yourEditText.setKeyListener(DigitsKeyListener.getInstance("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890 "));

для нижнего регистра с разрешающим пространством

yourEditText.setKeyListener(DigitsKeyListener.getInstance("abcdefghijklmnopqrstuvwxyz1234567890 "));

для верхнего регистра с разрешающим пространством (Требуемый ответ для этого вопроса)

yourEditText.setKeyListener(DigitsKeyListener.getInstance("abcdefghijklmnopqrstuvwxyz1234567890 "));