Android: Чому довге клацання також викликає звичайне клацання?


126

У мене ListView зі слухачами тривалий і звичайний клік.

Чому, коли я довго натискаю елемент списку, подія регулярного натискання також викликається?

Мені потрібно мати дві окремі функції для різних кліків.

Відповіді:


284

Від слухачів подій :

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

Ви повертаєтеся trueзі свого onLongClick()і все ще отримуєте звичайну подію клацання?

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


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

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

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

49

Перезапис відповіді простішими словами:

Подано:

@Override
public boolean onLongClick(View view) {

    return true; // or false
}
  • return trueозначає, що подія споживається. Це обробляється. Про інші події натискання не буде повідомлено.
  • return falseозначає, що подія не споживається. Будь-які інші події клацання продовжуватимуть отримувати сповіщення.

Тож якщо ви не хочете, onClickщоб ініціювались після onLongClick, тоді ви повинні return trueз onLongClickподії.


2
Супер ідеальна відповідь, якщо ми ставимо справжнє значення, то воно обробляє лише довге клацання, якщо ми ставимо помилку, то і події, і натискання, і довга натискання трапляються одразу
Пір Фахім Шах

Відмінна відповідь.
Сем Чен

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.