Android: pourquoi un clic long déclenche-t-il également un clic normal?

126

J'ai un ListView avec des auditeurs pour un clic long et un clic régulier.

Pourquoi, lorsque j'appuie longuement sur un élément de liste, l'événement de clic normal est également appelé?

J'ai besoin de deux fonctions distinctes pour les différents clics.

moelleux
la source

Réponses:

284

Des auditeurs d'événements :

onLongClick () - Cela retourne un booléen pour indiquer si vous avez consommé l'événement et qu'il ne doit pas être porté plus loin. Autrement dit, retournez true pour indiquer que vous avez géré l'événement et qu'il doit s'arrêter ici; retourne false si vous ne l'avez pas géré et / ou que l'événement doit se poursuivre vers tous les autres écouteurs au clic.

Êtes-vous de retour truede votre onLongClick()événement et recevez-vous toujours l'événement de clic normal?

Modifié pour ajouter : Pour un ListView, vous utilisez peut-être OnItemLongClickListener. L' onItemLongClick()il utilise une valeur de retour booléen similaire pour indiquer si elle a consommé l'événement.

Erichamion
la source
1
Pour définir l' myListView.setOnItemLongClickListener(this); option, vous devrez remplacer la fonction public boolean onItemLongClick(...). Ici, vous avez simplement besoin de return truece qui indique que le LongClick a été activé et annulera le déclencheur sur le clic normal. Si vous retournez false, cela déclenchera également le clic normal.
Brandon
qu'en est-il de l'autre situation, quand j'ai besoin de différer entre le clic long et le clic normal pour agir en fonction de cela
Muhammed Refaat
@erichamion J'ai essayé votre solution pour un problème similaire, sans succès. J'apprécierais toutes les idées ou idées que vous pourriez fournir, situées ici: stackoverflow.com/questions/47783631/…
AJW
50

Répétant la réponse en termes plus simples:

Donné:

@Override
public boolean onLongClick(View view) {

    return true; // or false
}
  • return truesignifie que l'événement est consommé. C'est manipulé. Aucun autre événement de clic ne sera notifié.
  • return falsesignifie que l'événement n'est pas consommé. Tous les autres événements de clic continueront de recevoir des notifications.

Donc, si vous ne voulez onClickpas être également déclenché après un onLongClick, vous devriez le faire à return truepartir de l' onLongClickévénement.

Suragch
la source
2
Réponse super parfaite si nous mettons la valeur vraie, alors il ne gère que le clic long si nous mettons faux, alors le clic et l'événement de pression longue se produisent en même temps
Pir Fahim Shah
Excellente réponse.
Sam Chen
20

Assurez-vous que vous remplacez OnClickListenervotre onClickméthode. Assurez-vous également que vous remplacez OnLongClickListenervotre onLongClickméthode. Et assurez-vous que votre onLongClickméthode retourne true, car cela consommera le fichier onClick.

Alex Lockwood
la source
J'ai ajouté true dans ma méthode onLongClick mais j'ai toujours un problème en ce que ma méthode onClick ne se déclenche pas par la suite. J'apprécierais toute réflexion ou idée sur la façon de résoudre, située ici: stackoverflow.com/questions/47783631/...
AJW
0

Vous pouvez implémenter la setOnLongClickListenercréation d'une instance de new View.OnClickListener()ou new View.OnLongClickListener(), si vous créez un clic long et implémentez un OnclickListener normal, vous obtiendrez ces erreurs de simple clic activant la méthode. Vous devez utiliser new View.OnLongClickListener()pour capturer uniquement les longs clics

Matheus Padovani
la source