Я нашел способ избежать этой проблемы: использование интересующих меня сенсорных событий.
Я хочу реагировать на нажатия в определенном углу поля редактирования (например, кнопку с открытым текстом илипароль просмотра один).
Сначала я попытался использовать только onTouchEvent, потому что мне были нужны координаты.Но среда IDE предупредила меня о том, что не нужно переопределять executeClick из соображений доступности.Идея состоит в том, что если вы добавите дополнительное поведение при касании, оно должно быть доступно и инструментам специальных возможностей, которые вызывают performClick
.
Но это не так.Дополнительные кнопки - это дополнительная функциональность, которая не должна быть доступна.Или, если он доступен, он не будет доступен как обычный / общий щелчок в поле редактирования.Может быть, как действие доступности, реализованное где-то еще.
Итак, вывод: я могу использовать только onTouchEvent и потреблять события.
Решение
override fun onTouchEvent(event: MotionEvent?): Boolean {
event!!
ensureDrawingInfo()
val touchArea = pluginAreaFromMotionEvent(event)
if (touchArea != null) {
// it's the special place, I will handle this
when (event.actionMasked) {
MotionEvent.ACTION_DOWN -> lastTouchArea = touchArea
MotionEvent.ACTION_CANCEL -> lastTouchArea = null
MotionEvent.ACTION_UP -> {
if (lastTouchArea == touchArea) { // proper click on place
// call the plugin
plugins[touchArea.pluginIndex].onClick(this, it.rightSide, ::invalidateDrawingInfo)
}
}
// consume touch events that happen on MY area
return true
}
return super.onTouchEvent(event)
}
Почему
Редактор EditText иногда открывает окно предложения в ответ на сенсорные события.И он хочет заменить текст в определенной позиции.Но это не заменит это сразу.Он ставит в очередь сообщение, которое будет обработано позже, используя зацикливание), поэтому, когда замена произойдет, я мог изменить текст.Я даже пытался поставить в очередь свой очищающий код в надежде, что это произойдет позже, но мне не повезло.
Самое чистое решение - использовать события относительно областей, которые я обрабатываю, чтобы редактор не провоцировалникаких проблем.
На самом деле, запустив это на эмуляторе API 27, я не смог воспроизвести ошибку.Я думаю, что код редактора изменился, чтобы он знал, что текст мог быть изменен между ними.