[prg] Re[2]: Как сэмулировать в android ввод символов с клавиатуры в editText,который поддерживает только цифры?
Всех приветствую. Мне кажется,что прошлый ответ не пришёл в
рассылку,поэтому я повторяю письмо с небольшим дополнением,поскольку
забыл немного добавить.Здравствуйте Анатолий. Вы писали
Уберите атрибут inputType, из файла xml-разметки для EditText. Или не
устанавливайте это свойство программно.
Дело в том,что меня очень просили,чтобы на кнопочном телефоне на
цифровых клавишах можно было бы вводить только цифры. Помогите
пожалуйста,как это сделать без imputType? Кстати,хоть в этом смарте нету
стрелок вправо-влево,но будет ли onKeyListener отрабатывать эти
стрелки,если я уберу inputType,поскольку когда были выбраны цифры,то
onKeyListener отрабатывал вертикальные стрелки,но стрелки вправо-влево
вообще не хотели обрабатываться,даже если я переношу весь код в метод
activity onKeyUp. Кстати посоветуете пожалуйста,Анатолий,что мне лучше
обрабатывать в моём случае,нажатие клавиши,или её отпускание? Ещё Вы пишете
А фильтрацию
осуществляйте сами либо реагируя на изменение текста
(TextView.addTextChangedListener), либо в OnKeyListener и манипулируя
методами класса Editable.
Подскажите пожалуйста,как это правильнее сделать? Просто мне и в том и в
другом случае нужно будет использовать метод setText,ведь вроде напрямую
в editText заменять или удалять текст нельзя,а при использовании этого
метода я буду должен использовать метод setSelection,чтобы установить
курсор в конец текста,но тогда talkback начнёт говорить конец текста,что
мне не нужно. Помогите пожалуйста,Анатолий,как это более правильно
сделать. Может надо послать какой-то accessibilityEvent для talkback,или
есть варианты попроще? Ещё Вы пишете
Чтобы не смущать зрячих пользователей экранной клавиатурой с полным рядом
цифр и букв, запретите её отображение.
Извините пожалуйста за очень глупый вопрос,но где это нужно сделать,т.е
в editText или в activity? Заранее благодарю Вас за помощь.
Приветствую всех.
Вы программно можете назначить свой InputFilter (и даже не один, используя
метод TextView.setFilter().
Для этого вам придётся самому написать реализацию InputFilter. Вот страница
с ответами на подобный вопрос:
https://stackoverflow.com/questions/3349121/how-do-i-use-inputfilter-to-limit-characters-in-an-edittext-in-android
Вот страница с тем же самым, но с корявым переводом на русский:
http://qaru.site/questions/40912/how-do-i-use-inputfilter-to-limit-characters-in-an-edittext-in-android
Это также был ответ на вопрос, как самому организовать фильтрацию ввода в
поле редактирования.
В Android есть несколько реализаций различных InputFilter (они перечислены
на странице документации), но вряд ли они вам подойдут. Документация:
https://developer.android.com/reference/android/text/InputFilter
Это вы на эмуляторе проверяли?
Имейте в виду, что в Android и так обработка клавиатурного ввода проходит не
без шероховатостей, но на эмуляторе из-за общих тормозов вы можете
столкнуться с заметным запаздыванием клавиатурных событий.
Всё-таки события KeyEvent и то, что пользователь вводит в поле
редактирования -- это не совсем одно и то же. Клавиши со стрелками не
фильтруются полем редактирования, так как это управляющие клавиши --
управляют курсором (если фокус в поле ввода) или фокусом ввода (в иных
случаях).
Поэтому атрибут inputType не должен влиять на работу методов onKey*, по
крайней мере, в части неалфавитных клавиш.
Вот примерно, что должно происходить при нажатии горизонтальных стрелок:
Если фокус в поле ввода, то клавиши с горизонтальными стрелками выполняют
перемещение курсора по символам. Когда пользователь пытается передвинуть
курсор за первый или за последний символ в поле ввода, то фокус переходит к
предыдущему / следующему элементу управления. Вопрос лишь в том, существует
ли этот предыдущий / следующий элемент и как система его определит. В таких
ситуациях для незрячего пользователя поведение фокуса может быть
неожиданным, поскольку система пытается выбрать предыдущий / следующий
элемент, исходя из визуального расположения элементов управления.
Логикой переходов фокуса можно управлять либо программно, либо задавая
соответствующие атрибут в xml-разметке.
Надо уточнять, что значит "лучше"...
Если вы хотите избежать многократной реакции на нажатие в случаях долгого
удержании клавиши нажатой, то обрабатывайте её отпускание.
Если пользователь удерживает клавишу нажатой более определённого времени, то
система начинает генерировать последовательность событий KeyDown так, как
будто пользователь нажимает клавишу много раз подряд.
Но событие KeyUp возникнет лишь один раз, когда пользователь реально
отпустит клавишу.
Как вариант:
TextView.void setShowSoftInputOnFocus (boolean show)
См. TextView -- это базовый класс для EditText и в нём есть много
возможностей для манипуляции текстом.
Класс InputMethodManager тоже позволяет манипулировать экранной клавиатурой
(то есть "методом ввода" -- сокращённо IME).