Я хочу поймать событие, когда пользователь заканчивает редактирование EditText.
Как это сделать?
android
android-edittext
eddyuk
источник
источник
override fun afterTextChanged(s: Editable?) { if (s.toString().length == 5) { val enteredString = s.toString() }
Ответы:
Когда пользователь закончит редактирование, он / она нажмет
Done
илиEnter
источник
Лучше всего, вы также можете использовать EditText onFocusChange listener, чтобы проверить, выполнил ли пользователь редактирование: (не нужно полагаться на то, что пользователь нажимает кнопку Done или Enter на мягкой клавиатуре)
Примечание. Для более чем одного EditText вы также можете позволить своему классу реализовать, а
View.OnFocusChangeListener
затем установить слушателей для каждого из вас EditText и проверить их, как показано ниже.источник
EditText
. Он никогда не потеряет фокус.EditText
? Я должен использоватьonEditorAction
?EditText
, вы проверяете, что пользователь делает, чтобы покинуть экран.W/ViewRootImpl: Cancelling event due to no window focus: MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=605.52246, y[0]=969.4336, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=238238, downTime=235422, deviceId=0, source=0x1002 }
Ввод», я получал примерно следующее сообщение: « Даже если я что-то ввел. Это текст редактирования, который принимает только числа.Я лично предпочитаю автоматическую отправку после окончания набора. Вот как вы можете обнаружить это событие.
Объявления и инициализация:
Слушатель, например, в onCreate ()
Итак, когда текст изменяется, таймер начинает ждать следующих изменений. Когда они происходят, таймер отменяется, а затем запускается снова.
источник
Handler
вместо этогоВы можете сделать это с помощью setOnKeyListener или с помощью textWatcher, например:
Установить наблюдатель текста
editText.addTextChangedListener(textWatcher);
тогда позвони
источник
Хотя многие ответы действительно указывают в правильном направлении, я думаю, что ни один из них не отвечает на то, о чем думал автор вопроса. Или, по крайней мере, я иначе понял вопрос, потому что искал ответ на похожую проблему. Проблема заключается в том, «как узнать, когда пользователь прекращает вводить текст без нажатия кнопки» и запускать какое-либо действие (например, автозаполнение). Если вы хотите сделать это, запустите таймер в onTextChanged с задержкой, которую вы считаете, что пользователь перестал печатать (например, 500-700 мс), для каждой новой буквы, когда вы запускаете таймер, отменяйте предыдущую (или, по крайней мере, используйте какой-то отметьте, что когда они ставят галочку, они ничего не делают). Вот код, аналогичный тому, что я использовал:
Обратите внимание, что я изменяю рабочий логический флаг внутри моей асинхронной задачи (Task получает json с сервера для автозаполнения).
Также имейте в виду, что это создает много задач таймера (я думаю, что они запланированы в одном потоке, но вам нужно это проверить), поэтому, вероятно, есть много мест, которые можно улучшить, но этот подход также работает, и суть в том, что вы должны используйте таймер, поскольку нет сообщения «Пользователь прекратил вводить сообщение»
источник
оба @Reno и @Vinayak B ответят вместе, если вы хотите скрыть клавиатуру после действия
источник
Другой подход ... вот пример: если у пользователя есть задержка в 600-1000 мс при вводе текста, вы можете считать, что он остановился.
источник
Хорошо, это наверняка сработает на 100%.
Сначала вам нужно будет настроить прослушиватель, если клавиатура отображается или скрывается. Если отображается клавиатура, возможно, пользователь печатает, в противном случае печатает.
источник
heightDiff > 100
штука страшная имхо.Я решил эту проблему таким образом. Я использовал котлин.
источник
У меня была такая же проблема, и я не хотел полагаться на то, что пользователь нажимает Done или Enter.
Моя первая попытка состояла в том, чтобы использовать прослушиватель onFocusChange, но оказалось, что мой EditText получил фокус по умолчанию. Когда пользователь нажимал какое-то другое представление, onFocusChange запускался без того, чтобы пользователь никогда не назначал ему фокус.
Следующее решение сделало это для меня, где onFocusChange прикреплен, если пользователь коснулся EditText:
В моем случае, когда пользователь закончил редактирование, экран был повторно отрисован, тем самым обновив объект myEditText. Если тот же объект сохраняется, вам, вероятно, следует удалить прослушиватель onFocusChange в onFocusChange, чтобы предотвратить проблему onFocusChange, описанную в начале этого сообщения.
источник
У меня была такая же проблема при попытке реализовать «сейчас набираю текст» в приложении чата. попробуйте расширить EditText следующим образом:
}
источник
Я покончил с ней с той же проблемой, и я не мог использовать решение с onEditorAction или onFocusChange и не хотел пробовать таймер. Таймер слишком опасен для вкуса из-за всех потоков и слишком непредсказуем, поскольку вы не знаете, когда ваш код выполняется.
OnEditorAction не улавливает, когда пользователь уходит без использования кнопки, и если вы его используете, обратите внимание, что KeyEvent может иметь значение null. Фокус ненадежен на обоих концах, пользователь может получить фокус и уйти, не вводя текст или не выбирая поле, и пользователю не нужно оставлять последнее поле EditText.
В моем решении используется onFocusChange и установлен флаг, когда пользователь начинает редактировать текст, и функцию для получения текста из последнего сфокусированного представления, которое я вызываю при необходимости.
Я просто снимаю фокус со всех своих текстовых полей, чтобы обмануть код представления оставленного текста. Код clearFocus выполняется только в том случае, если поле имеет фокус. Я вызываю функцию в onSaveInstanceState, поэтому мне не нужно сохранять флаг (mEditing) как состояние представления EditText и при нажатии важных кнопок и при закрытии действия.
Будьте осторожны с TexWatcher, так как он часто вызывается. Я использую условие фокуса, чтобы не реагировать, когда код onRestoreInstanceState вводит текст. я
источник
Я сделал что-то вроде этого абстрактного класса, который можно использовать вместо типа TextView.OnEditorActionListener.
источник
Легко вызвать завершение набора текста в EditText
работал у меня, если вы используете java, конвертируйте его
В Котлине
источник