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é.
- 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();
}
});
- 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;
}
}
}
- 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>