Comment gérer les clics sur le bouton à l'aide de XML onClick dans des Fragments
Pré-Honeycomb (Android 3), chaque Activité a été enregistrée pour gérer les clics de bouton via le onClick
balise dans une Mise en page XML:
android:onClick="myClickMethod"
À l'intérieur de cette méthode, vous pouvez utiliser view.getId()
et une instruction switch pour faire le bouton de la logique.
Avec l'introduction de Nid d'abeille, je suis en rupture de ces Activités dans les Fragments qui peuvent être réutilisés à l'intérieur de nombreuses Activités différentes. La plupart du comportement des boutons est une Activité indépendante, et je voudrais le code de résider à l'intérieur de l'Fragments de fichier sans l'aide de l'ancien (pré 1.6) méthode d'enregistrement de la OnClickListener
pour chaque bouton.
final Button button = (Button) findViewById(R.id.button_id);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//Perform action on click
}
});
Le problème est que lors de ma mise en page sont gonflés, il est encore l'Activité d'hébergement, qui reçoivent un clics de bouton, pas les différents Fragments. Est-il une bonne approche soit
- Enregistrer le fragment de recevoir les clics de bouton?
- Passer les cliquez sur les événements à partir de l'Activité pour l'fragment ils appartiennent?
- Ne pouvez-vous pas gérer l'enregistrement des auditeurs dans le onCreate de le fragment?
- Oui, mais je ne veux pas avoir à utiliser
setOnClickListener
etfindViewById
pour chaque bouton, c'est pourquoionClick
a été ajouté, afin de rendre les choses plus simples. - En regardant la accepté de répondre, je pense que l'aide de setOnClickListener est couplée de manière plus lâche que de coller à XML onClick approche. Si l'activité est de "en avant" à chaque clic de souris vers la droite fragment cela signifie que le code sera à changer à chaque fois un fragment est ajouté. À l'aide d'une interface de découpler du fragment de la classe de base n'aide pas avec qui. Si le fragment inscrit sur le bon bouton lui-même, l'activité reste complètement agnostique quel est le meilleur style de l'OMI. Voir aussi la réponse de Adorjan Princz.
- être d'accord avec Adriaan sur celui-ci. Avoir un aller de Adorjan de réponse et de voir si la vie n'est pas mieux après.
Vous devez vous connecter pour publier un commentaire.
Vous pourriez faire ceci:
Activité:
Fragment:
En réponse à @Ameen qui voulaient moins de couplage afin Fragments sont réutilisables
Interface:
Activité:
Fragment:
myClickMethod_actual
ou quelque chose comme ça. Car il pourrait y avoir une ambiguïté sur lequel la méthode est appelée au plus tard au cours de temps. Je sais que, à ce stade, la méthode de l'activité est à seulement un tampon, mais vous pouvez ajouter quelque chose à plus tard.XmlClickable
interfaceXML
, pas deJAVA
!Je préfère utiliser la solution suivante pour la manipulation d'événement onClick. Cela fonctionne pour l'Activité et Fragments.
android:onClick
pour les boutons placés dans les lignes de la listview et puis je viens de fairegetPositionForView(v)
pour obtenir la position. Je ne sais pas comment l'utiliser pour y parvenir.UIResponder
de classe, cependant, pour des fragments de cette solution est aussi proche que ça va venir.android.view.View.OnClickListener
. Pour moi, pour une raison quelconque, je dois vraiment dire queimplements View.OnClickListener
, de sorte que peut être votre problème.XML
... qui est la PO du problème. Merci bienLe problème je pense est que le point de vue est toujours l'activité, et non pas le fragment. Les fragments n'ont pas de point de vue indépendant sur son propre et est joint à la société mère des activités de vue. C'est pourquoi la fin de l'événement dans l'Activité, et non pas le fragment. Malheureux, mais je pense que vous aurez besoin d'un peu de code pour faire ce travail.
Ce que j'ai fait lors des conversions, est tout simplement l'ajout d'un écouteur de clics que les appels de l'ancien gestionnaire d'événement.
par exemple:
Récemment j'ai résolu ce problème, sans avoir à ajouter une méthode dans le contexte de l'Activité ou d'avoir à mettre en œuvre OnClickListener. Je ne suis pas sûr si c'est un "valide" solution non plus, mais il fonctionne.
Basée sur: https://developer.android.com/tools/data-binding/guide.html#binding_events
Il peut être fait avec les liaisons de données: il suffit d'ajouter votre fragment instance comme une variable, alors vous pouvez lier un méthode onClick.
Et le fragment de liaison de code serait...
android:name="fragment" android:type="com.example.testapp.fragments.CustomFragment"/>
ButterKnife est probablement la meilleure solution pour le problème de l'encombrement. Il utilise l'annotation des processeurs pour générer le soi-disant "ancienne méthode" code réutilisable.
Mais le onClick méthode peut encore être utilisé, avec un gonfleur.
Comment utiliser
Mise en œuvre
Je préfère aller pour le clic de la manipulation dans le code de l'aide de l'
onClick
attribut XML lorsque vous travaillez avec des fragments.Cela devient encore plus facile lors de la migration de vos activités à des fragments. Vous pouvez simplement appeler le gestionnaire de clic (précédemment définie
android:onClick
en XML) directement à partir de chaquecase
bloc.Quand il s'agit de la manipulation de clics dans les fragments, cela ressemble plus simple pour moi que
android:onClick
.C'est une autre façon:
1.Créer un BaseFragment comme ceci:
2.Utilisation
au lieu de
3.Dans votre activité:
et
Espère que cela aide.
Dans mon cas d'utilisation, j'ai 50 bizarre ImageViews j'avais besoin de le brancher dans une seule méthode onClick. Ma solution est de faire une boucle sur les points de vue à l'intérieur du fragment et de définir le même onclick écoute sur chaque:
Que j'ai de voir les réponses qu'ils sont en quelque sorte des vieux. Récemment Google introduire La liaison de données qui est beaucoup plus facile à manipuler onClick ou de l'affectation dans votre xml.
Ici est un bon exemple que vous pouvez voir comment le gérer :
Il est également très bon tutoriel sur la liaison de données vous pouvez trouver Ici.
Vous pouvez définir un rappel, comme un attribut XML de mise en page. L'article Personnalisé Attributs XML Pour Votre Custom Widgets Android va vous montrer comment le faire pour un widget personnalisé. Le crédit va à Kevin Dion 🙂
Je suis en train d'étudier si je peux ajouter styleable attributs de la base Fragment de classe.
L'idée de base est d'avoir la même fonctionnalité de ce point de Vue met en œuvre lorsqu'ils traitent avec le onClick de rappel.
L'ajout de Blundell réponse,
Si vous avez plus de fragments, avec beaucoup de onClicks:
Activité:
Dans Votre Fragment:
Si vous vous inscrivez en xml à l'aide de android:Onclick="", la fonction de rappel sera donné à l'respectés de l'Activité dans le contexte duquel votre fragment appartient à (getActivity() ). Si une telle méthode n'est pas trouvée dans l'Activité, puis le système va lever une exception.
Vous pouvez envisager d'utiliser l'EventBus pour découplé des événements ..
Vous pouvez écouter les événements très facilement. Vous pouvez aussi assurez-vous que l'événement est reçu sur le thread d'interface utilisateur (au lieu de l'appeler runOnUiThread.. pour vous-même pour tous les cas d'abonnement)
https://github.com/greenrobot/EventBus
à partir de Github:
Je voudrais ajouter à Adjorn Linkz de réponse.
Si vous avez besoin de plusieurs gestionnaires, vous pouvez simplement utiliser lambda références
L'astuce ici est que
handler
signature de la méthode correspond àView.OnClickListener.onClick
signature. De cette façon, vous n'aurez pas besoin d'View.OnClickListener
interface.Aussi, vous n'aurez pas besoin de les instructions switch.
Malheureusement, cette méthode est limitée à des interfaces qui nécessitent une méthode unique, ou un lambda.
Ce travail a été pour moi:(Android studio)
Meilleure solution à mon humble avis:
du fragment:
puis dans le Fragment de la onViewStateRestored:
Votre Activité est de recevoir le rappel que doit avoir:
Si vous voulez que votre fragment de recevoir de rappel alors faire ceci:
et de mettre en œuvre
onClickListener
interface sur Fragment