Переключите InputType с Text на Number на лету
Канадские почтовые индексы имеют следующий формат: A1A1A1
и сопоставьте следующее регулярное выражение:
[ABCEGHJKLMNPRSTVXY][0-9][A-Z][0-9][A-Z][0-9]
Я настраиваю EditText
для пользователя, чтобы ввести свой почтовый индекс. Я хотел бы отображать альтернативно текст и цифровую клавиатуру.
Наивно, я использую этот код в TextWatcher или InputFilter
if (Character.isDigit(s.charAt(s.length() - 1))) {
zipView.setInputType(InputType.TYPE_CLASS_TEXT
| InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS
| InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS);
} else {
zipView.setInputType(InputType.TYPE_CLASS_PHONE);
}
Однако это приводит к исключению, когда пользователь вводит первый номер.
java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:464)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:454)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:33)
at android.text.method.NumberKeyListener.onKeyDown(NumberKeyListener.java:121)
at android.widget.TextView.doKeyDown(TextView.java:5787)
at android.widget.TextView.onKeyDown(TextView.java:5600)
at android.view.KeyEvent.dispatch(KeyEvent.java:2609)
... (продолжает, не упоминая мои занятия.)
Я предполагаю, что тип ввода не нравится, что в представлении уже есть неподдерживаемые символы.
1 ответ
Тип ввода на самом деле не ограничивает разрешенные клавиши, это подсказка клавиатуре относительно того, что будет введено, поэтому клавиатура может решить изменить свой интерфейс. Ничто не мешает вам добавить текст в числовое поле. Похоже, проблема вызывает замену в фильтре, который вы установили (фильтры отличаются от типа ввода).
Фактически, большинство клавиатур даже не запускают это - классы XXXKeyListener обычно вызываются только аппаратными клавиатурами, которые вызывают события нажатия клавиш и нажатия клавиш. Программные клавиатуры обычно этого не делают. Вы изначально дали этому полю тип ввода NULL? Это единственное, что может заставить среднюю программную клавиатуру претендовать на аппаратную.
И еще одна вещь - установка режима ввода, когда поле активно, обычно не работает. Если вы не сбросите входное соединение, большинство клавиатур даже не обнаружит его (для стороны клавиатуры нет API изменения типа ввода). Если вы сбросите входное соединение, вы, скорее всего, столкнетесь со всевозможным странным поведением с автозаменой и синхронизацией (я знаю, что у Swype было дюжина различных правил для отмены событий, которые мешали сбросу входного соединения). Никогда не рекомендуется менять тип ввода.