111 votes

Android : comment gérer le clic d'un bouton

Ayant une solide expérience dans le domaine non-Java et non-Android, j'apprends Android.

J'ai beaucoup de confusion dans différents domaines, l'un d'entre eux étant la façon de gérer les clics de bouton. Il y a au moins 4 façons de le faire ( !!!), elles sont brièvement énumérées ci-dessous aquí

Par souci de cohérence, je vais les énumérer :

  1. Avoir un membre de la View.OnClickListener dans l'activité et l'assigner à une instance qui gérera la classe onClick logique dans le onCreate méthode d'activité.

  2. Créez un "onClickListener" dans la méthode d'activité "onCreate" et affectez-le au bouton en utilisant setOnClickListener.

  3. Implémentez 'onClickListener' dans l'activité elle-même et assignez 'this' comme un écouteur pour le bouton. Si l'activité comporte plusieurs boutons, l'identifiant du bouton doit être analysé afin d'exécuter le gestionnaire "onClick" pour le bon bouton.

  4. Avoir une méthode publique sur l'activité qui implémente la logique 'onClick' et l'assigner au bouton dans la déclaration xml de l'activité.

Question n° 1 :

Est-ce que ce sont toutes les méthodes, y a-t-il une autre option ? (Je n'en ai pas besoin, je suis juste curieux)

Pour moi, la manière la plus intuitive serait la dernière : elle nécessite le moins de code à taper et est la plus lisible (du moins pour moi).

Cependant, je ne vois pas cette approche utilisée à grande échelle. Quels sont les inconvénients de son utilisation ?

Question n°2 :

Quels sont les avantages et les inconvénients de chacune de ces méthodes ? Veuillez partager votre expérience ou un bon lien.

Tout commentaire est le bienvenu !

P.S. J'ai essayé de chercher sur Google et de trouver quelque chose pour ce sujet, mais les seules choses que j'ai trouvées sont des descriptions du "comment" faire cela, pas pourquoi c'est bon ou mauvais.

2voto

Michael Points 456

Pour faciliter les choses comme l'indique la question 2, vous pouvez utiliser une méthode lambda comme celle-ci pour économiser la mémoire des variables et éviter de naviguer de haut en bas dans votre classe de vue.

//method 1
findViewById(R.id.buttonSend).setOnClickListener(v -> {
          // handle click
});

mais si vous souhaitez appliquer l'événement de clic à votre bouton en une seule fois dans une méthode.

vous pouvez utiliser la question 3 par @D. Tran réponse. Mais n'oubliez pas d'implémenter votre classe de vue avec View.OnClickListener .

Afin d'utiliser correctement la question 3

1voto

CChi Points 1499

Les options 1 et 2 impliquent l'utilisation d'une classe interne qui rendra le code un peu fouillis. L'option 2 est un peu désordonnée car il y aura un écouteur pour chaque bouton. Si vous avez un petit nombre de boutons, cela ne pose pas de problème. Quant à l'option 4, je pense qu'elle sera plus difficile à déboguer, car vous devrez revenir en arrière et modifier le code xml et java. Personnellement, j'utilise l'option 3 lorsque je dois gérer plusieurs clics de bouton.

1voto

Webserveis Points 1102

Mon échantillon, testé dans Android studio 2.1

Définir un bouton dans une mise en page xml

<Button
    android:id="@+id/btn1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

Détection de la pulsation Java

Button clickButton = (Button) findViewById(R.id.btn1);
if (clickButton != null) {
    clickButton.setOnClickListener( new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            /***Do what you want with the click here***/
        }
    });
}

0voto

Gaurav Arora Points 1735

Question#1 - C'est la seule façon de gérer les clics de vue.

Question n°2 -
Option#1/Option#4 - Il n'y a pas beaucoup de différence entre l'option#1 et l'option#4. La seule différence que je vois est que dans un cas l'activité implémente le OnClickListener, alors que, dans l'autre cas, il y aurait une implémentation anonyme.

Option#2 - Dans cette méthode, une classe anonyme sera générée. Cette méthode est un peu fastidieuse, car vous devrez le faire plusieurs fois, si vous avez plusieurs boutons. Pour les classes anonymes, vous devez faire attention à la gestion des fuites de mémoire.

Option#3 - Bien que, c'est un moyen facile. Habituellement, les programmeurs essaient de ne pas utiliser une méthode avant de l'avoir écrite, et donc cette méthode n'est pas largement utilisée. Vous verrez que la plupart des gens utilisent l'option 4. Parce que c'est plus propre en terme de code.

0voto

Ryan The Leach Points 297

Il existe également des options disponibles sous la forme de diverses bibliothèques qui peuvent rendre ce processus très familier aux personnes ayant utilisé d'autres cadres MVVM.

https://developer.Android.com/topic/libraries/data-binding/

Montre un exemple d'une bibliothèque officielle, qui vous permet de lier les boutons comme ceci :

<Button
    android:text="Start second activity"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onClick="@{() -> presenter.showList()}"
/>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X