Как я могу обнаружить ключевое событие delete (backspace) для editText? Я пробовал использовать TextWatcher, но когда editText пуст, когда я нажимаю клавишу удаления, ничего не происходит. Я хочу обнаружить нажатие клавиши удаления для editText, даже если у него нет текста.
android
events
android-edittext
key
Буда Гаврил
источник
источник
event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_DEL
если вы не хотите, чтобы событие запускалось дважды при нажатии клавиши BackspaceПрошло некоторое время с тех пор, как вы спросили, но у меня была такая же проблема. Как уже упоминала Эстель, проблема с ключевыми слушателями заключается в том, что они работают только с аппаратными клавиатурами. Чтобы сделать это с помощью IME (программной клавиатуры) , решение немного сложнее.
Единственный метод , который мы действительно хотим переопределить это
sendKeyEvent
вEditText
«SInputConnection
класса. Этот метод вызывается при возникновении ключевых событий в IME. Но для того, чтобы переопределить это, нам нужно реализовать кастом,EditText
который переопределяетonCreateInputConnection
метод, заключаяInputConnection
объект по умолчанию в прокси-класс! : |Звучит сложно, но вот простейший пример, который я смог придумать:
Строка с призывом
setRandomBackgroundColor
- это то место, где происходит мое специальное действие возврата. В этом случае изменениеEditText
цвета фона.Если вы раздуваете это из XML, не забудьте использовать полное имя пакета в качестве тега:
источник
Это просто дополнение к ответу Идриса, а также добавление переопределения для deleteSurroundingText. Я нашел больше информации об этом здесь: Android: Backspace в WebView / BaseInputConnection
источник
deleteSurroundingText
Немного было именно то , что мне нужно было после попытки множества других решений.Вот мое простое решение, которое работает для всех API:
ОБНОВЛЕНИЕ 17.04.18 .
Как указано в комментариях, это решение не отслеживает нажатие клавиши Backspace, если EditText пуст (как и большинство других решений).
Однако этого достаточно для большинства случаев использования.
PS Если бы мне сегодня пришлось создать что-то подобное, я бы сделал:
Затем просто используйте его как обычный TextWatcher:
источник
Отправил 2 дня на поиск решения и разобрался рабочий :) (по софт клавишам)
После добавления текстового наблюдателя в ваш EditText:
Надеюсь, он работает и на других устройствах Android (samsung, LG и т. Д.).
источник
Мое простое решение, которое отлично работает. Вы должны добавить флаг. Мой фрагмент кода:
источник
Пример создания EditText с TextWatcher
пользовательский TextWatcher
источник
для тех, кто использует Котлин
addOnTextChanged
недостаточно гибок, чтобы обрабатывать некоторые случаи (например: определить, нажимает ли пользователь удаление, когда текст редактирования был пуст)setOnkeyListener
работала даже мягкая клавиатура или жесткая клавиатура! но только на некоторых устройствах . В моем случае он работает на Samsung s8, но не работает на Xiaomi mi8 se.если вы используете kotlin, вы можете использовать функцию кросслайна,
doOnTextChanged
это то же самое,addOnTextChanged
но обратный вызов запускается, даже если текст редактирования был пуст.ПРИМЕЧАНИЕ: doOnTextChanged является частью библиотеки Android KTX.
источник
doOnTextChanged
функция расширения доступна в Android KTX библиотекиEditText
? Спасибо заранееВ Stackoverflow есть аналогичный вопрос. Вам нужно переопределить
EditText
, чтобы получить доступ кInputConnection
объекту, который содержитdeleteSurroundingText
метод. Это поможет вам обнаружить событие удаления (возврата). Пожалуйста, взгляните на решение, которое я предоставил там Android - не может захватывать backspace / delete press в soft. клавиатураисточник
Кажется, это работает для меня:
источник
Я также столкнулся с такой же проблемой в Dialog .. потому что я использую setOnKeyListener .. Но я установил значение return true. После изменения, как показано ниже, у меня все работает нормально.
источник
На основе @Jiff
ZanyEditText
здесьWiseEditText
сsetSoftKeyListener(OnKeyListener)
источник
Моя проблема была, что у меня был обычай
Textwatcher
, так что я не хочу , чтобы добавитьOnKeyListener
кEditText
так же как я не хотел создавать собственныеEditText
. Я хотел определить, была ли нажата клавиша Backspace в моемafterTextChanged
методе, поэтому я не должен запускать свое событие.Вот как я это решил. Надеюсь, это будет кому-то полезно.
источник
Я тестировал решение @ Jeff на версиях 4.2, 4.4, 6.0. На 4.2 и 6.0 работает хорошо. Но на 4.4 не работает.
Я нашел простой способ обойти эту проблему. Ключевым моментом является вставка невидимого символа в содержимое EditText в самом начале и не позволять пользователю перемещать курсор перед этим символом. Мой способ - вставить символ пробела с ImageSpan нулевой ширины. Вот мой код.
И нам нужен пользовательский EditText, у которого есть SelectionChangeListener
}
И последний шаг
И теперь мы закончили. Мы можем обнаружить событие клавиши Backspace, когда EditText не имеет фактического содержимого, и пользователь ничего не знает о нашем трюке.
источник
Этот вопрос может быть старым, но ответ очень прост с использованием TextWatcher.
источник
Я нашел действительно простое решение, которое работает с мягкой клавиатурой.
источник
Вы можете установить ключевой прослушиватель для действия, а в методе обратного вызова вы можете определить, какой ключ нажимает пользователь. Код ниже предназначен для справки. Надеюсь, поможет.
источник