web-dev-qa-db-fra.com

En quoi l'utilisation de l'interface OnClickListener est-elle différente via XML et le code Java?

Duplicate possible:
Différence entre l'événement OnClick () et OnClickListener?

Le développement de Android est quasi automatique et lorsque j'ai commencé, j'essayais d'éviter d'utiliser la présentation XML de quelque manière que ce soit, de sorte que certains de mes projets précédents impliquent des boutons qui créent explicitement un OnClickListener et l'implémentent en tant que classe intérieure anonyme. Tel que -

final Button button = new Button(this);
button.setText("Click to change second line of text");

OnClickListener buttonListener = new View.OnClickListener() {
    boolean clicked = false;
    int numClicks = 0;

    @Override
    public void onClick(View v) {
        if(numClicks > 5) {
            button.setText("STOP IT");
        }
        numClicks++;
        if(clicked == false){
            clicked = true;
            tv2.setText("Text Changed on Button Click");    
        }
        else
        {
            clicked = false;
            tv2.setText("Click again");
        }       
    }
};
button.setOnClickListener(buttonListener);

Mais à mesure que je me familiarisais avec Android, je commençais à comprendre la valeur des dispositions xml et à mettre en place des boutons comme celui-ci.

    <Button
    Android:id="@+id/button1"
    Android:layout_height = "wrap_content"
    Android:layout_width ="wrap_content"
    Android:text = "lets do this"
    Android:onClick = "DoIt"
    />

Dans la mise en page XML, où DoIt a été défini dans le Java.

Ma question est la suivante: ces 2 méthodes sont-elles fonctionnellement identiques? Un compilateur OnClick est-il défini par le compilateur quelque part en coulisse? Existe-t-il des fonctionnalités que vous échangez en utilisant l'une ou l'autre manière?

68
SmashCode

Ce sont exactement les mêmes. Android:onClick a été ajouté à l'API de niveau 4 pour simplifier l'utilisation du Web à la manière de Javascript et gérer tout le contenu XML. En interne, elle ajoute un OnClickListener sur le bouton, qui appelle votre méthode DoIt.

Voici ce que l'utilisation d'un Android:onClick="DoIt" en interne:

Button button= (Button) findViewById(R.id.buttonId);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        DoIt(v);
    }
});

La seule chose que vous échangiez en utilisant Android:onClick, comme d'habitude avec la configuration XML, est qu'il est un peu plus difficile d'ajouter du contenu dynamique (par programme, vous pouvez décider d'ajouter un écouteur ou un autre en fonction de vos variables). Mais ceci est facilement annulé en ajoutant votre test dans la méthode DoIt.

162
Guillaume

en utilisant XML, vous devez définir vous-même l’auditeur onclick. Commencez par avoir votre classe implements OnClickListener puis ajoutez la variable Button button1; puis ajoutez-la à votre onCreate()

button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(this);

lorsque vous implémentez OnClickListener, vous devez ajouter la méthode héritée onClick() où vous allez gérer vos clics.

4
Bill Gary

Même si vous définissez Android: onClick = "DoIt" en XML, vous devez vous assurer que votre activité (ou contexte de vue) a une méthode publique définie avec exactement le même nom et avec le paramètre Afficher en tant que. Android relie vos définitions avec cette implémentation en activité. A la fin, l'implémentation aura le même code que vous avez écrit en classe interne anonyme. Ainsi, en termes simples, au lieu d’avoir attaché une classe interne et un auditeur à une activité, vous aurez simplement une méthode publique avec le code d’implémentation.

2
kosa