Exemples de code Android

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>