Android: Warum löst ein langer Klick auch einen normalen Klick aus?

126

Ich habe eine ListView mit Listenern für einen langen Klick und einen regulären Klick.

Warum wird auch das reguläre Klickereignis aufgerufen, wenn ich lange auf ein Listenelement drücke?

Ich brauche zwei separate Funktionen für die verschiedenen Klicks.

mellowg
quelle

Antworten:

284

Von Event-Listenern :

onLongClick () - Dies gibt einen Booleschen Wert zurück, der angibt, ob Sie das Ereignis konsumiert haben und es nicht weiter ausgeführt werden sollte. Geben Sie also true zurück, um anzuzeigen, dass Sie das Ereignis behandelt haben und es hier aufhören sollte. Geben Sie false zurück, wenn Sie dies nicht behandelt haben und / oder das Ereignis für andere On-Click-Listener fortgesetzt werden soll.

Kehren Sie truevon Ihrem onLongClick()Ereignis zurück und erhalten immer noch das normale Klickereignis?

Zum Hinzufügen bearbeitet : Für eine ListView verwenden Sie möglicherweise OnItemLongClickListener. Der onItemLongClick()dort verwendet einen ähnlichen boolean Rückgabewert , um anzuzeigen , ob es das Ereignis verbraucht.

Erichamion
quelle
1
Um die myListView.setOnItemLongClickListener(this); Option einzustellen, müssen Sie die Funktion überschreiben public boolean onItemLongClick(...). Hier müssen Sie lediglich return trueangeben, dass der LongClick aktiviert wurde und den Trigger beim regulären Klicken abbrechen. Wenn Sie false zurückgeben, wird auch der reguläre Klick ausgelöst.
Brandon
Was ist mit der anderen Situation, wenn ich zwischen dem langen Klick und dem normalen Klick unterscheiden muss, um entsprechend zu handeln
Muhammed Refaat
@erichamion Ich habe Ihre Lösung für ein ähnliches Problem versucht, ohne Glück. Ich würde mich über Erkenntnisse oder Gedanken freuen, die
AJW
49

Die Antwort in einfacheren Worten wiedergeben:

Gegeben:

@Override
public boolean onLongClick(View view) {

    return true; // or false
}
  • return truebedeutet, dass das Ereignis verbraucht ist. Es wird gehandhabt. Es werden keine anderen Klickereignisse benachrichtigt.
  • return falsebedeutet, dass das Ereignis nicht verbraucht wird. Alle anderen Klickereignisse erhalten weiterhin Benachrichtigungen.

Wenn Sie also nicht onClickauch nach einem ausgelöst werden möchten , onLongClicksollten Sie return trueaus dem onLongClickEreignis.

Suragch
quelle
2
Super perfekte Antwort, wenn wir den wahren Wert setzen, dann behandelt es nur lange Klicks, wenn wir falsche setzen, dann treten sowohl Klick als auch langes Presseereignis gleichzeitig auf
Pir Fahim Shah
Hervorragende Antwort.
Sam Chen
20

Stellen Sie sicher, dass Sie OnClickListenerIhre onClickMethode überschreiben . Stellen Sie außerdem sicher, dass Sie OnLongClickListenerIhre onLongClickMethode überschreiben . Und stellen Sie sicher, dass Ihre onLongClickMethode zurückkehrt true, da dies die verbraucht onClick.

Alex Lockwood
quelle
Ich habe in meiner onLongClick-Methode true hinzugefügt, habe aber immer noch ein Problem damit, dass meine onClick-Methode danach nicht mehr ausgelöst wird. Ich würde mich über Gedanken oder Ideen zur Lösung freuen
AJW
0

Sie können das setOnLongClickListenerErstellen einer Instanz von new View.OnClickListener()oder implementieren. new View.OnLongClickListener()Wenn Sie einen Long-Klick erstellen und einen normalen OnclickListener implementieren, werden diese Fehler angezeigt, wenn Sie die Methode mit einem Klick aktivieren. Sie sollten new View.OnLongClickListener()nur lange Klicks abfangen

Matheus Padovani
quelle