Ответ 1
В XML добавьте следующее:
android:digits="abcdefghijklmnopqrstuvwxyz1234567890 "
Как я могу ограничить 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" без необходимости ограничивать клавиатуру в верхнем регистре.
В 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
, они применяются в этом порядке. К счастью, 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:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
android:inputType="textCapCharacters"
Я попытался использовать textAllCaps="true"
, как это было предложено в комментарии к принятому ответу на этот вопрос, но он не работал должным образом.
Если вам не нужна большая часть настроек, простой трюк на самом деле из вышеперечисленного со всеми символами, которые вы хотите добавить в android: цифры
android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
Это должно работать, чтобы принимать буквенно-цифровые значения с помощью Caps и Small letters.
попробуйте это:
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 "));