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.