Android: почему долгий щелчок одновременно вызывает обычный щелчок?


126

У меня есть ListView со слушателями для долгого и обычного щелчка.

Почему, когда я долго нажимаю на элемент списка, также вызывается обычное событие щелчка?

Мне нужно иметь две отдельные функции для разных кликов.

Ответы:


284

Из слушателей событий :

onLongClick () - возвращает логическое значение, указывающее, использовали ли вы событие, и его не следует переносить дальше. То есть, верните true, чтобы указать, что вы обработали событие и на этом нужно остановиться; верните false, если вы не обработали его и / или событие должно продолжаться для любых других прослушивателей щелчка.

Вы возвращаетесь trueиз своего onLongClick()и все еще получаете обычное событие щелчка?

Отредактировано для добавления : для ListView вы можете использовать OnItemLongClickListener. onItemLongClick()Там используется аналогичное логическое возвращаемое значение , чтобы указать потребляется ли это событие.


1
Для установки myListView.setOnItemLongClickListener(this); опции вам нужно будет переопределить функцию public boolean onItemLongClick(...). Здесь вам просто нужно, чтобы return trueуказать, что LongClick был активирован и отменит триггер при обычном нажатии. Если вы вернете false, он также вызовет обычный щелчок.
Брэндон

как насчет другой ситуации, когда мне нужно различать долгий щелчок и нормальный щелчок, чтобы предпринять действия в соответствии с этим,
Мухаммед Рефаат

@erichamion Я попробовал ваше решение для аналогичной проблемы, но безуспешно. Буду признателен за любые идеи или мысли, которые вы могли бы предоставить, расположенные здесь: stackoverflow.com/questions/47783631/…
AJW

50

Перефразируя ответ проще:

Дано:

@Override
public boolean onLongClick(View view) {

    return true; // or false
}
  • return trueозначает, что событие потреблено. Это обработано. Никакие другие события щелчка не будут уведомлены.
  • return falseозначает, что событие не используется. Уведомления о любых других событиях щелчка будут по-прежнему приходить.

Так что, если вы не хотите, onClickчтобы вас запускали после события onLongClick, вам следует return trueиз этого onLongClickсобытия.


2
Супер идеальный ответ, если мы установим истинное значение, тогда он будет обрабатывать только долгий щелчок, если мы поставим false, тогда как щелчок, так и длительное нажатие происходят одновременно
Пир Фахим Шах

Отличный ответ.
Сэм Чен

20

Убедитесь, что вы переопределяете OnClickListenerсвой onClickметод. Также убедитесь, что вы переопределяете OnLongClickListenerсвой onLongClickметод. И убедитесь, что ваш onLongClickметод возвращает результат true, поскольку он будет использовать onClick.


Я добавил true в свой метод onLongClick, но все еще проблема в том, что мой метод onClick после этого не срабатывает. Я был бы признателен за любые мысли или идеи о том, как решить, расположенные здесь: stackoverflow.com/questions/47783631/…
AJW

0

Вы можете реализовать setOnLongClickListenerсоздание экземпляра new View.OnClickListener()или new View.OnLongClickListener(), если вы создадите длинный щелчок и реализуете обычный OnclickListener, вы получите эти ошибки при активации метода одним щелчком. Используйте new View.OnLongClickListener()для ловли только длинных кликов

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.