Когда я пытаюсь добавить onTouchListner()
к кнопке, я получаю
Кнопка имеет вызов setOnTouchListener, но не отменяет performClick
предупреждение. Кто-нибудь знает как исправить?
btnleftclick.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return false;
}
});
Ошибка:
Пользовательское представление вызвало setOnTouchListener, но не переопределяет performClick. Если представление, которое переопределяет onTouchEvent или использует OnTouchListener, не реализует также performClick и вызывает его при обнаружении щелчков, представление может не обрабатывать действия специальных возможностей должным образом. В идеале логика обработки действий щелчка должна быть помещена в View # performClick, поскольку некоторые службы специальных возможностей вызывают performClick, когда должно произойти действие щелчка.
ImageView
вызвало setOnTouchListener, но не переопределяет performClick. Если представление, которое переопределяет onTouchEvent или использует OnTouchListener, также не реализует performClick и не вызывает его при обнаружении щелчков, представление может не обрабатывать действия специальных возможностей должным образом. В идеале логика обработки действий щелчка должна быть помещена в View # performClick, поскольку некоторые службы специальных возможностей вызывают performClick, когда должно произойти действие щелчка.Ответы:
Это предупреждение появляется, потому что Android хочет напомнить вам подумать о слепых или слабовидящих людях, которые могут использовать ваше приложение. Я предлагаю вам посмотреть это видео, чтобы получить краткий обзор того, на что это похоже.
Все стандартные представления пользовательского интерфейса (например
Button
,TextView
и т. Д.) Настроены для предоставления слепым пользователям соответствующей обратной связи через службы доступности. Когда вы пытаетесь самостоятельно обрабатывать сенсорные события, вы рискуете забыть предоставить эту обратную связь. Это то, для чего нужно предупреждение.Вариант 1. Создайте собственное представление
Обработка событий касания обычно выполняется в настраиваемом представлении. Не отказывайтесь от этого варианта слишком быстро. Это не так уж и сложно. Вот полный пример,
TextView
который переопределяется для обработки событий касания:Тогда вы просто использовали бы это так:
См. Мой другой ответ для получения дополнительных сведений о создании настраиваемого представления.
Вариант 2. Отключение предупреждения
В других случаях было бы лучше просто отключить предупреждение. Например, я не уверен, что вы хотите сделать с элементом
Button
, для которого вам нужны события касания. Если вы должны были сделать пользовательскую кнопку и называетсяperformClick()
в ,onTouchEvent
как я сделал выше для таможниTextView
, то он будет вызываться дважды каждый раз , потому чтоButton
уже вызываетperformClick()
.Вот пара причин, по которым вы можете просто отключить предупреждение:
Добавьте следующую строку в начало метода, чтобы подавить предупреждение:
Например:
источник
MotionEvent event
объект в вашемdoSomething()
методе? Мне нужно проверитьevent.getY()
.performClick()
. Моя первоначальная мысль: еслиevent.getY()
это не является неотъемлемой частью фактического события щелчка (то есть визуальных эффектов пользовательского интерфейса), то переместите эту логику обратно вonTouchEvent()
. В противном случае вы можете создать переменную-член класса для хранения последнегоY
значения действия . Я также предлагаю вам ознакомиться с исходным кодом некоторых стандартных представлений, чтобы посмотреть, как это реализует Android. Мне нужно больше их изучить.onTouchEvent()
но нетperformClick()
. Это может включать в себя смахивание или щелчок или любое другое событие касания, которое вы пытаетесь зафиксировать.Решение:
Создайте класс, расширяющий Button или любое другое представление, которое вы используете, и переопределите performClick ()
Теперь используйте этот TouchableButton в xml и / или коде, и предупреждение исчезнет!
источник
android.widget.Button
жестко запрограммирован, поэтому он не позволяет вам этого делать. И похоже, что команда разработчиков Android сделала это намеренно.Вы пробовали добавить:
или добавив аннотацию suppresslint:
?
источник
https://developer.android.com/guide/topics/ui/accessibility/custom-views#custom-touch-events
источник