Android: perché il clic lungo attiva anche un clic normale?


126

Ho un ListView con ascoltatori per un clic lungo e un clic normale.

Perché, quando premo a lungo un elemento dell'elenco, viene richiamato anche il normale evento clic?

Ho bisogno di due funzioni separate per i diversi clic.

Risposte:


284

Dai listener di eventi :

onLongClick () : restituisce un valore booleano per indicare se hai consumato l'evento e non dovrebbe essere portato oltre. Ovvero, restituisci true per indicare che hai gestito l'evento e che dovrebbe fermarsi qui; restituisce false se non l'hai gestito e / o l'evento deve continuare per qualsiasi altro ascoltatore al clic.

Stai tornando truedal tuo onLongClick()e ricevi ancora il normale evento clic?

Modificato per aggiungere : per un ListView, potresti utilizzare OnItemLongClickListener. Il onItemLongClick()c'è utilizza un valore di ritorno booleano simile per indicare se si consuma l'evento.


1
Per impostare l' myListView.setOnItemLongClickListener(this); opzione, dovrai sovrascrivere la funzione public boolean onItemLongClick(...). Qui è sufficiente return trueindicare che LongClick è stato attivato e annullerà il trigger al clic normale. Se restituisci false, attiverà anche il normale clic.
Brandon

che dire dell'altra situazione, quando ho bisogno di differenziare tra il clic lungo e il clic normale per agire in base a quello
Muhammed Refaat

@erichamion Ho provato la tua soluzione per un problema simile, senza fortuna. Apprezzerei qualsiasi approfondimento o pensiero che potresti fornire, che si trova qui: stackoverflow.com/questions/47783631/…
AJW

50

Riaffermando la risposta in termini più semplici:

Dato:

@Override
public boolean onLongClick(View view) {

    return true; // or false
}
  • return truesignifica che l'evento è consumato. È gestito. Nessun altro evento di clic verrà notificato.
  • return falsesignifica che l'evento non è consumato. Qualsiasi altro evento di clic continuerà a ricevere notifiche.

Quindi, se non si vuole onClickper essere attivato anche dopo una onLongClick, allora si dovrebbe return truedalla onLongClickmanifestazione.


2
Risposta super perfetta se mettiamo un valore vero, gestisce solo il clic lungo se mettiamo falso, quindi entrambi gli eventi di clic e di pressione lunga si verificano contemporaneamente
Pir Fahim Shah

Ottima risposta.
Sam Chen

20

Assicurati di sovrascrivere il OnClickListenertuo onClickmetodo. Assicurati anche di sovrascrivere il OnLongClickListenertuo onLongClickmetodo. E assicurati che il tuo onLongClickmetodo ritorni true, poiché questo consumerà il file onClick.


Ho aggiunto true nel mio metodo onLongClick ma ho ancora un problema in quanto il mio metodo onClick non si attiva in seguito. Apprezzerei qualsiasi pensiero o idea su come risolvere, che si trova qui: stackoverflow.com/questions/47783631/…
AJW

0

Puoi implementare la setOnLongClickListenercreazione di un'istanza di new View.OnClickListener()o new View.OnLongClickListener(), se crei un clic lungo e implementa un normale OnclickListener, otterrai questo errore di clic singolo attivando il metodo. Dovresti usare new View.OnLongClickListener()per catturare solo clic lunghi

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.