web-dev-qa-db-fra.com

Android onClick in XML vs. OnClickListener

Je me rends compte qu'une question similaire a déjà été posée, mais c'est différent. Je suis assez nouveau dans le développement de Android apps et j'ai trois questions concernant la (les) différence (s) entre le Android:onclick="" _ Attribut XML et la méthode setOnClickListener.

  1. Quelles sont les différences entre les deux? La différence entre les deux implémentations se trouve-t-elle au moment de la compilation, de l'exécution ou des deux?

  2. Quels cas d'utilisation sont favorables à quelle mise en œuvre?

  3. Quelle (s) différence (s) l'utilisation de fragments dans Android fait-elle un choix d'implémentation?

75
KG6ZVP

Différence entre OnClickListener et OnClick:

  • OnClickListener est l'interface que vous devez implémenter et peut être définie sur une vue dans Java).
  • OnClickListener est ce qui attend quelqu'un cliquer réellement, onclick détermine ce qui se produit lorsque quelqu'un clique.
  • Dernièrement Android a ajouté un attribut xml aux vues appelé Android: onclick, qui permet de gérer les clics directement dans l’activité de la vue sans avoir à implémenter d’interface.
  • Vous pouvez facilement remplacer une implémentation d'écoute par une autre si vous en avez besoin.
  • Un OnClickListener vous permet de séparer l'action/le comportement de l'événement click de la vue qui déclenche l'événement. Bien que, dans les cas simples, cela ne soit pas si grave, pour une gestion d'événements complexe, cela pourrait signifier une meilleure lisibilité et une plus grande facilité de maintenance du code.
  • Comme OnClickListener est une interface, la classe qui l'implémente dispose de la souplesse nécessaire pour déterminer les variables d'instance et les méthodes dont elle a besoin pour gérer l'événement. Encore une fois, ce n'est pas un problème dans les cas simples, mais pour les cas complexes, nous ne voulons pas nécessairement mélanger les variables/méthodes liées à la gestion des événements avec le code de la vue qui déclenche l'événement.
  • L'onClick avec une liaison de fonction dans XML Layout est une liaison entre onClick et la fonction qu'il appellera. La fonction doit avoir un argument (la vue) pour que onClick puisse fonctionner.

Les deux fonctionnent de la même manière, à la différence que l'un est défini via Java) et l'autre via le code xml.

implémentation du code setOnClickListener:

Button btn = (Button) findViewById(R.id.mybutton);

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    myFancyMethod(v);
    }
});

// some more code

public void myFancyMethod(View v) {
    // does something very interesting
}

implémentation XML:

<?xml version="1.0" encoding="utf-8"?>
<!-- layout elements -->
<Button Android:id="@+id/mybutton"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:text="Click me!"
    Android:onClick="myFancyMethod" />
<!-- even more layout elements -->

Performance:

Les deux sont les mêmes en performance. XML est pré-analysé en code binaire lors de la compilation. il n'y a donc pas de surcharge dans XML.

Limitation:

Android: onClick est destiné au niveau 4 de l'API. Si vous ciblez <1,6, vous ne pourrez pas l'utiliser.

113
Jebasuthan

Je suis choqué que personne n'en parle, mais faites attention, bien que Android:onClick XML semble être un moyen pratique de gérer les clics, l'implémentation de setOnClickListener fait quelque chose de plus que d'ajouter le onClickListener. . En effet, il a mis la propriété view clickable sur true.

Bien que ce ne soit pas un problème pour la plupart des implémentations Android, selon le constructeur du téléphone, bouton est toujours clickable = true mais les constructeurs de certains modèles de téléphone peuvent avoir la valeur par défaut clickable = false sur Vues de bouton non.

Donc, définir le code XML ne suffit pas, vous devez penser tout le temps à ajouter Android:clickable="true" Sur un bouton, et si vous avez un périphérique où la valeur par défaut est clickable = true et que vous oubliez même une fois de mettre cet attribut XML , vous ne remarquerez pas le problème au moment de l'exécution, mais vous obtiendrez le retour d'informations sur le marché lorsqu'il sera entre les mains de vos clients!

De plus, nous ne pouvons jamais être sûrs de la façon dont proguard obscurcira et renommera les attributs XML et la méthode de classe, donc pas sûr à 100% qu’ils n’auront jamais un bogue un jour.

Donc, si vous ne voulez jamais avoir de problèmes et n'y pensez jamais, il est préférable d'utiliser setOnClickListener ou des bibliothèques comme ButterKnife avec annotation @OnClick(R.id.button)

13
Livio

Simplement:

Si tu as Android:onClick = "someMethod"in xml, il cherche le public void someMethod dans votre classe d'activité. OnClickListener s'appelle right de votre activité et est lié à un certain View. Par exemple someButton.setOnClickListener et dans le code ci-dessous, on dit ce qui doit être fait lorsque l'on appuie sur someButton.

J'espère que ça aide :)

11
marson

Comme indiqué précédemment: ils constituent un moyen d'ajouter de la logique en réponse à un événement, dans ce cas un événement "clic".

Je choisirais une séparation entre logique et présentation, comme nous le faisons dans le monde HTML/JavaScript: laissez le XML pour la présentation et ajoutez des écouteurs d'événement au moyen d'un code.

2
Stephan van Hoof

Il est plus pratique de toujours utiliser Android: l'attribut onClick, sauf si vous avez une bonne raison de ne pas le faire, par exemple, si vous instanciez le bouton au moment de l'exécution ou si vous devez déclarer le comportement du clic dans une sous-classe Fragment.

0
Mustapha Hadid

Si vous avez plusieurs boutons n'utilisant qu'une méthode, je vous suggère de le faire en Java. Mais si vous avez un bouton avec une méthode spécifique, onClick en XML serait mieux.

0
Megs