Pré-Honeycomb (Android 3), chaque activité a été enregistrée pour gérer les clics sur les boutons via la onClick
balise dans le XML d'une mise en page:
android:onClick="myClickMethod"
Dans cette méthode, vous pouvez utiliser view.getId()
et une instruction switch pour faire la logique du bouton.
Avec l'introduction de Honeycomb, je divise ces activités en fragments qui peuvent être réutilisés dans de nombreuses activités différentes. La plupart du comportement des boutons est indépendant de l'activité, et j'aimerais que le code réside dans le fichier Fragments sans utiliser l'ancienne méthode (antérieure à 1.6) d'enregistrement du 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 lorsque ma disposition est gonflée, c'est toujours l'activité d'hébergement qui reçoit les clics sur les boutons, pas les fragments individuels. Existe-t-il une bonne approche pour
- Enregistrer le fragment pour recevoir les clics sur le bouton?
- Passer les événements de clic de l'activité au fragment auquel ils appartiennent?
la source
setOnClickListener
etfindViewById
pour chaque bouton, c'est pourquoi aonClick
été ajouté, pour simplifier les choses.Réponses:
Vous pouvez simplement faire ceci:
Activité:
Fragment:
En réponse à @Ameen qui voulait moins de couplage pour que les fragments soient réutilisables
Interface:
Activité:
Fragment:
la source
Je préfère utiliser la solution suivante pour gérer les événements onClick. Cela fonctionne également pour l'activité et les fragments.
la source
Le problème, je pense, c'est que la vue est toujours l'activité, pas le fragment. Les fragments n'ont pas de vue indépendante et sont attachés à la vue des activités parentes. C'est pourquoi l'événement se termine dans l'activité, pas le fragment. C'est malheureux, mais je pense que vous aurez besoin de code pour que cela fonctionne.
Ce que j'ai fait pendant les conversions, c'est simplement ajouter un écouteur de clics qui appelle l'ancien gestionnaire d'événements.
par exemple:
la source
J'ai récemment résolu ce problème sans avoir à ajouter une méthode à l'activité de contexte ni à implémenter OnClickListener. Je ne sais pas si c'est une solution "valide" non plus, mais cela fonctionne.
Basé sur: https://developer.android.com/tools/data-binding/guide.html#binding_events
Cela peut être fait avec des liaisons de données: ajoutez simplement votre instance de fragment en tant que variable, puis vous pouvez lier n'importe quelle méthode avec onClick.
Et le fragment liant le code serait ...
la source
android:name="fragment" android:type="com.example.testapp.fragments.CustomFragment"/>
name
ettype
de lavariable
balise ne devraient pas avoir leandroid:
préfixe. Peut-être existe-t-il une ancienne version des mises en page Android qui l'exige?ButterKnife est probablement la meilleure solution pour le problème de l'encombrement. Il utilise des processeurs d'annotation pour générer le code passe-partout dit "ancienne méthode".
Mais la méthode onClick peut toujours être utilisée, avec un gonfleur personnalisé.
Comment utiliser
la mise en oeuvre
la source
Je préfère opter pour la gestion des clics dans le code plutôt que d'utiliser l'
onClick
attribut en XML lorsque vous travaillez avec des fragments.Cela devient encore plus facile lors de la migration de vos activités en fragments. Vous pouvez simplement appeler le gestionnaire de clics (précédemment défini sur
android:onClick
XML) directement à partir de chaquecase
bloc.Quand il s'agit de gérer les clics en fragments, cela me semble plus simple que
android:onClick
.la source
C'est une autre façon:
1.Créez un BaseFragment comme ceci:
2.Utilisez
au lieu de
3.Dans votre activité:
et
J'espère que cela aide.
la source
Dans mon cas d'utilisation, j'ai 50 images vues impaires dont j'avais besoin pour me connecter à une seule méthode onClick. Ma solution consiste à parcourir les vues à l'intérieur du fragment et à définir le même écouteur onclick sur chacune:
la source
Comme je vois les réponses, elles sont en quelque sorte vieilles. Récemment, Google a introduit DataBinding, qui est beaucoup plus facile à gérer sur Click ou à attribuer dans votre xml.
Voici un bon exemple que vous pouvez voir comment gérer cela:
Il y a aussi un très bon tutoriel sur DataBinding que vous pouvez trouver ici .
la source
Vous pouvez définir un rappel comme attribut de votre présentation XML. L'article Attributs XML personnalisés pour vos widgets Android personnalisés vous montrera comment le faire pour un widget personnalisé. Le mérite revient à Kevin Dion :)
J'examine si je peux ajouter des attributs stylables à la classe Fragment de base.
L'idée de base est d'avoir les mêmes fonctionnalités que View implémente lors du traitement du rappel onClick.
la source
Ajout à la réponse de Blundell,
si vous avez plus de fragments, avec beaucoup d'onClicks:
Activité:
Dans votre fragment:
la source
Si vous vous inscrivez en xml en utilisant android: Onclick = "", un rappel sera donné à l'activité respectée dans le contexte de laquelle votre fragment appartient (getActivity ()). Si une telle méthode n'est pas trouvée dans l'activité, le système lèvera une exception.
la source
Vous voudrez peut-être envisager d'utiliser EventBus pour les événements découplés. Vous pouvez écouter les événements très facilement. Vous pouvez également vous assurer que l'événement est reçu sur le thread d'interface utilisateur (au lieu d'appeler runOnUiThread .. par vous-même pour chaque abonnement à un événement)
https://github.com/greenrobot/EventBus
de Github:
la source
Je voudrais ajouter à la réponse d' Adjorn Linkz .
Si vous avez besoin de plusieurs gestionnaires, vous pouvez simplement utiliser des références lambda
L'astuce ici est que
handler
la signature de la méthode correspond à laView.OnClickListener.onClick
signature. De cette façon, vous n'aurez pas besoin de l'View.OnClickListener
interface.De plus, vous n'aurez besoin d'aucune instruction switch.
Malheureusement, cette méthode n'est limitée qu'aux interfaces qui nécessitent une seule méthode ou un lambda.
la source
Bien que j'aie repéré de jolies réponses en s'appuyant sur la liaison de données, je n'en ai vu aucune allant dans toute la mesure avec cette approche - dans le sens d'activer la résolution des fragments tout en permettant des définitions de disposition sans fragment dans XML.
Donc, en supposant que la liaison de données est activée, voici une solution générique que je peux proposer; Un peu long mais ça marche définitivement (avec quelques mises en garde):
Étape 1: implémentation OnClick personnalisée
Cela lancera une recherche sensible aux fragments à travers les contextes associés à la vue sur laquelle vous avez tapé (par exemple le bouton):
Étape 2: application déclarative dans les fichiers de mise en page
Ensuite, dans les XML sensibles à la liaison de données:
Avertissements
FragmentActivity
implémentation «moderne»la source
Cela a fonctionné pour moi: (studio Android)
la source
Meilleure solution à mon humble avis:
en fragment:
puis dans onViewStateRestored de Fragment:
la source
Votre activité reçoit le rappel, comme cela a dû être le cas:
Si vous souhaitez que votre fragment reçoive un rappel, procédez comme suit:
et implémenter l'
onClickListener
interface sur Fragmentla source