Trois méthodes pour gérer les clics de bouton dans Android

Le traitement des événements de clic sur les boutons est une tâche fondamentale dans le développement d'applications Android. Trois approches principales existent pour implémenter cette fonctionnalité.

  1. Utilisation d'une classe anonyme interne

Cette méthode consiste à créer une instance d'une classe anonyme implémentant l'interface View.OnClickListener directement en paramètre de la méthode setOnClickListener. L'avantage est de centraliser la logique de l'événement près de la déclaration du composant.

boutonAction.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View vue) {
        Toast.makeText(ActivitePrincipale.this, messageInfo, Toast.LENGTH_SHORT).show();
    }
});

  1. Implémentation directe de l'interface OnClickListener

L'activité elle-même implémente l'interface View.OnClickListener. Tous les boutons utilisant cette écoute enverront leurs événements à la méthode onClick unique de l'activité, où il faudra différencier les sources via l'identifiant de la vue.

public class ActivitePrincipale extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activite_principale);

        Button autreBouton = findViewById(R.id.bouton2);
        autreBouton.setOnClickListener(this);
    }

    @Override
    public void onClick(View source) {
        switch (source.getId()) {
            case R.id.bouton2:
                // Traitement spécifique
                break;
        }
    }
}

  1. Déclaration dans le fichier de layout avec l'attribut android:onClick

Il est possible d'atacher une méthode publique de l'activité directement via un attribut XML. Le nom de la méthode spécifié doit correspondre à une méthode publique de l'activité, acceptant un unique paramètre de type View.

<Button
    android:id="@+id/bouton3"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onClick="traiterClic"
    android:text="Cliquez ici" />

Puis dans l'activité :

public void traiterClic(View vue) {
    if (vue.getId() == R.id.bouton3) {
        // Logique de traitement
    }
}

Exemple d'implémentation complète

Voici un exemple intégrant les trois méthodes dans un même projet. Le fichier de layout (res/layout/activite_principale.xml) définit plusieurs boutons avec différentes configurasions d'écoute.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <Button
        android:id="@+id/btn_classe_anonyme"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Écoute via classe anonyme" />

    <Button
        android:id="@+id/btn_interface"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Écoute via interface" />

    <Button
        android:id="@+id/btn_attribut_xml"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onBoutonAttributClique"
        android:text="Écoute via attribut XML" />

</LinearLayout>

La classe MainActivity associe ces différents boutons à leurs gestionnaires respectifs.

package com.example.gestionclics;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private String messageAnonyme;
    private String messageInterface;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activite_principale);

        messageAnonyme = getString(R.string.msg_classe_anonyme);
        messageInterface = getString(R.string.msg_interface);

        // Configuration du bouton avec classe anonyme
        Button boutonAnonyme = findViewById(R.id.btn_classe_anonyme);
        boutonAnonyme.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                afficherMessage(messageAnonyme);
            }
        });

        // Configuration du bouton avec l'interface
        Button boutonInterface = findViewById(R.id.btn_interface);
        boutonInterface.setOnClickListener(this);
    }

    @Override
    public void onClick(View source) {
        if (source.getId() == R.id.btn_interface) {
            afficherMessage(messageInterface);
        }
    }

    // Méthode associée à l'attribut android:onClick
    public void onBoutonAttributClique(View vue) {
        afficherMessage(getString(R.string.msg_attribut));
    }

    private void afficherMessage(String texte) {
        Toast.makeText(this, texte, Toast.LENGTH_SHORT).show();
    }
}

Les chaînes de caractères utilisées sont définies dans res/values/strings.xml.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Démonstration Clics</string>
    <string name="msg_classe_anonyme">Clic géré par une classe anonyme.</string>
    <string name="msg_interface">Clic géré par l\'interface de l\'activité.</string>
    <string name="msg_attribut">Clic géré via l\'attribut android:onClick.</string>
</resources>

Étiquettes: Android Java UI Events Button OnClickListener

Publié le 10 août à 20h17