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
.
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?
Quels cas d'utilisation sont favorables à quelle mise en œuvre?
Quelle (s) différence (s) l'utilisation de fragments dans Android fait-elle un choix d'implémentation?
Différence entre OnClickListener et OnClick:
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.
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)
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 :)
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.
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.
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.