Как ограничить 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» без необходимости ограничивать клавиатуру в верхнем регистре.

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

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

  android:digits="abcdefghijklmnopqrstuvwxyz1234567890 " 

Как ограничить 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 установлены 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); 

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

 android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" 

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

Использовать это:

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

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

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

 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 ""; } } }); } 

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

android:inputType="textVisiblePassword"

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

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

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

Для этого вам нужно создать свой собственный фильтр и установить его в 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-файле.

Один ответ

Сделать это onCreate

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

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

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

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

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

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