Gestionnaire d'événement dans une classe interne anonyme
Puisque la classe PeintreMagique (voir exemple précédent) n'est utilisée que pour la création du paramètre de setOnClickListener, pourquoi ne pas définir la classe directement à cet endroit, sans lui donner de nom et en spécifiant quand même qu'elle implémente View.OnClickListener? C'est ce qu'on appelle une classe anonyme, une classe sans nom.
MainActivity.java
package net.codeandroid.couleur3; import androidx.appcompat.app.AppCompatActivity; import android.graphics.Color; import android.os.Bundle; import android.view.View; import android.widget.Button; import java.util.Random; // Affiche une couleur aléatoire lorsque l'on clique sur un bouton (utilisation // d'une classe interne anonyme comme gestionnaire d'événement). public class MainActivity extends AppCompatActivity { // zone d'affichage de la couleur private View mZoneCouleur; // couleurs disponibles private int[] mCouleur = { Color.BLACK, Color.BLUE, Color.CYAN, Color.DKGRAY, Color.GRAY, Color.GREEN, Color.LTGRAY, Color.MAGENTA, Color.RED, Color.WHITE, Color.YELLOW}; // point d'entrée de l'application @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // chargement de la mise en page setContentView(R.layout.activity_main); // récupération des composants depuis le fichier de mise en page mZoneCouleur = findViewById(R.id.zone_couleur); Button bouton = (Button) findViewById(R.id.bouton); // définit et instancie le gestionnaire (classe anonyme) en une opération bouton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // choisit aléatoirement une couleur Random generator = new Random(); int index = generator.nextInt(mCouleur.length); // change la couleur d'arrière-plan de la vue mZoneCouleur.setBackgroundColor(mCouleur[index]); } }); } }
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/bouton" android:layout_height="wrap_content" android:layout_width="match_parent" android:text="@string/label_bouton"/> <TextView android:id="@+id/zone_couleur" android:layout_height="match_parent" android:layout_width="match_parent"/> </LinearLayout>
strings.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Couleur 3</string> <string name="label_bouton">Couleur magique</string> </resources>