Android: dlaczego długie kliknięcie powoduje również normalne kliknięcie?

126

Mam ListView z odbiornikami dla długiego kliknięcia i zwykłego kliknięcia.

Dlaczego, gdy długo naciskam element listy, wywoływane jest również zwykłe zdarzenie kliknięcia?

Muszę mieć dwie oddzielne funkcje dla różnych kliknięć.

mellowg
źródło

Odpowiedzi:

284

Od słuchaczy zdarzeń :

onLongClick () - zwraca wartość logiczną wskazującą, czy zdarzenie zostało wykorzystane i nie powinno być dalej przenoszone. Oznacza to, że zwraca true, aby wskazać, że zdarzenie zostało obsłużone i powinno się na tym zatrzymać; zwraca wartość false, jeśli nie została przez Ciebie obsłużona i / lub zdarzenie powinno zostać przekazane innym odbiornikom po kliknięciu.

Czy wracasz trueze swojego onLongClick()i nadal otrzymujesz normalne zdarzenie kliknięcia?

Edytowano w celu dodania : w przypadku ListView możesz używać OnItemLongClickListener. onItemLongClick()Nie wykorzystuje podobną wartość logiczną powrotny do wskazania, czy spożywane zdarzenie.

erichamion
źródło
1
Aby ustawić myListView.setOnItemLongClickListener(this); opcję, musisz zastąpić funkcję public boolean onItemLongClick(...). Tutaj wystarczy, return trueco wskazuje, że LongClick został aktywowany i anuluje wyzwalacz przy zwykłym kliknięciu. Jeśli zwrócisz wartość false, spowoduje to również zwykłe kliknięcie.
Brandon
co z inną sytuacją, kiedy muszę odróżnić długie kliknięcie od normalnego kliknięcia, aby podjąć odpowiednie działania
Muhammed Refaat
@erichamion Wypróbowałem Twoje rozwiązanie podobnego problemu, ale bez powodzenia. Byłbym wdzięczny za wszelkie spostrzeżenia i przemyślenia, które możesz przekazać, znajdujące się tutaj: stackoverflow.com/questions/47783631/ ...
AJW
49

Przedstawiając odpowiedź w prostszych słowach:

Dany:

@Override
public boolean onLongClick(View view) {

    return true; // or false
}
  • return trueoznacza, że ​​zdarzenie zostało skonsumowane. To jest obsługiwane. Żadne inne zdarzenia związane z kliknięciami nie będą powiadamiane.
  • return falseoznacza, że ​​wydarzenie nie jest konsumowane. Wszelkie inne zdarzenia związane z kliknięciami będą nadal otrzymywać powiadomienia.

Więc jeśli nie chcesz, onClickaby został wyzwolony również po zdarzeniu onLongClick, powinieneś return truez tego onLongClickzdarzenia.

Suragch
źródło
2
Super idealna odpowiedź, jeśli ustawimy wartość true, to obsłuży tylko długie kliknięcie, jeśli ustawimy fałsz, a następnie kliknięcie i długie naciśnięcie wystąpią jednocześnie
Pir Fahim Shah,
Doskonała odpowiedź.
Sam Chen
20

Upewnij się, że OnClickListenerTwoja onClickmetoda jest nadrzędna . Upewnij się również, że OnLongClickListenerTwoja onLongClickmetoda jest nadrzędna . I upewnij się, że Twoja onLongClickmetoda zwraca true, ponieważ spowoduje to wykorzystanie pliku onClick.

Alex Lockwood
źródło
Dodałem true w mojej metodzie onLongClick, ale nadal mam problem z tym, że moja metoda onClick nie uruchamia się później. Byłbym wdzięczny za wszelkie przemyślenia lub pomysły, jak rozwiązać, znajdujące się tutaj: stackoverflow.com/questions/47783631/ ...
AJW
0

Możesz wdrożyć setOnLongClickListenertworzenie instancji new View.OnClickListener()lub new View.OnLongClickListener(), jeśli utworzysz długie kliknięcie i zaimplementujesz normalny OnclickListener, otrzymasz te błędy aktywacji metody jednym kliknięciem. Należy używać new View.OnLongClickListener()do łapania tylko długich kliknięć

Matheus Padovani
źródło