J'ai deux classes. Le premier est l'activité, le second est un fragment où j'en ai EditText
. Dans l'activité, j'ai une sous-classe avec async-task et dans la méthode, doInBackground
j'obtiens un résultat que j'enregistre dans une variable. Comment envoyer cette variable de la sous-classe "mon activité" à ce fragment?
android
android-fragments
user1302569
la source
la source
getArguments().getString(key)
Vous pouvez également accéder aux données d'activité à partir du fragment:
Activité:
Fragment:
la source
Bundle
classe pour transmettre des informations. Vous pouvez également fairegetMyData()
hériter et implémenter cette méthode à partir d'une interface etFragment
vérifier si getActivity renvoie uneinstanceof
interface dansonAttach()
.J'ai trouvé beaucoup de réponses ici @ stackoverflow.com mais c'est certainement la bonne réponse:
Msgstr "Envoi de données d 'activité à fragmenter dans android".
Activité:
Fragment:
Lecture de la valeur dans le fragment
ou juste
la source
Cette réponse est peut-être trop tard. mais il sera utile pour les futurs lecteurs.
J'ai quelques critères. J'ai codé pour choisir le fichier d'intention. et le fichier sélectionné à transmettre à un fragment particulier pour un traitement ultérieur. j'ai de nombreux fragments ayant la fonctionnalité de cueillette de fichiers. à l'époque, à chaque fois vérifier la condition et obtenir le fragment et passer la valeur est assez dégoûtant. donc, j'ai décidé de passer la valeur en utilisant l'interface.
Étape 1: Créez l'interface sur l'activité principale.
Étape 2: créer la référence SelectedBundle sur la même activité
Étape 3: créer la méthode dans la même activité
Étape 4: Besoin d'initialiser la référence SelectedBundle qui sont tous des fragments ont besoin de la fonctionnalité de sélection de fichiers.Vous placez ce code sur votre
onCreateView(..)
méthode de fragmentÉtape 5: Mon cas, je dois passer l'image Uri de HomeActivity pour la fragmenter. J'ai donc utilisé cette fonctionnalité sur la méthode onActivityResult.
onActivityResult de MainActivity, transmettez les valeurs aux fragments à l'aide de l'interface.
Remarque: votre cas peut être différent. vous pouvez l'appeler de n'importe où depuis votre HomeActivity.
C'est tout. Implémentez chaque fragment dont vous avez besoin sur la FragmentClass. Vous êtes formidable. Vous avez fait. SENSATIONNEL...
la source
L'idée de base de l'utilisation des fragments (F) est de créer des composants d'interface utilisateur autonomes réutilisables dans les applications Android. Ces fragments sont contenus dans des activités et il existe un (meilleur) moyen commun de créer des voies de communication de A -> F et FA, il est indispensable de communiquer entre FF à travers une activité car alors seuls les fragments deviennent découplés et auto-entretenus.
Ainsi, le passage des données de A -> F sera le même que celui expliqué par ρяσѕρєя K. En plus de cette réponse, après la création des fragments à l'intérieur d'une activité, nous pouvons également transmettre des données aux fragments appelant des méthodes dans Fragments.
Par exemple:
la source
L'approche la meilleure et la plus pratique consiste à appeler une instance de fragment et à envoyer des données à ce moment. chaque fragment par défaut a une méthode d'instance
vous appellerez donc votre fragment d'une activité comme celle-ci:
* R.id.container est un identifiant de mon FrameLayout
ainsi dans MyFragment.newInstance ("data1", "data2") vous pouvez envoyer des données à fragmenter et dans votre fragment vous obtenez ces données dans MyFragment newInstance (String param1, String param2)
puis dans la méthode de fragment onCreate , vous obtiendrez les données:
la source
Je voudrais ajouter pour les débutants que la différence entre les 2 réponses les plus votées ici est donnée par l'utilisation différente d'un fragment.
Si vous utilisez le fragment dans la classe java où vous avez les données que vous souhaitez transmettre, vous pouvez appliquer la première réponse pour transmettre les données:
Si toutefois vous utilisez par exemple le code par défaut donné par Android Studio pour les fragments à onglets, ce code ne fonctionnera pas.
Cela ne fonctionnera pas même si vous remplacez le PlaceholderFragment par défaut par vos FragmentClasses, et même si vous corrigez FragmentPagerAdapter à la nouvelle situation en ajoutant un commutateur pour getItem () et un autre commutateur pour getPageTitle () (comme illustré ici )
Attention: le clip mentionné ci-dessus contient des erreurs de code, que j'expliquerai plus loin ici, mais est utile pour voir comment vous passez du code par défaut au code modifiable pour les fragments à onglets)! Le reste de ma réponse est beaucoup plus logique si vous considérez les classes java et les fichiers xml de ce clip (représentatif d'une première utilisation de fragments tabulés par un scénario débutant).
La principale raison pour laquelle la réponse la plus positive de cette page ne fonctionnera pas est que dans ce code par défaut pour les fragments à onglets, les fragments sont utilisés dans une autre classe java: FragmentPagerAdapter!
Donc, pour envoyer les données, vous êtes tenté de créer un bundle dans MotherActivity et de le passer dans FragmentPagerAdapter, en utilisant la réponse n ° 2.
Seulement, c'est encore mal. ( Vous pourriez probablement le faire comme ça, mais ce n'est qu'une complication qui n'est pas vraiment nécessaire ).
La manière correcte / plus facile de le faire, je pense, est de passer les données directement au fragment en question, en utilisant la réponse n ° 2. Oui, il y aura un couplage étroit entre l'activité et le fragment, MAIS, pour les fragments à onglets, ce qui est en quelque sorte attendu. Je vous conseillerais même de créer les fragments tabulés à l'intérieur de la classe java MotherActivity (en tant que sous-classes, car ils ne seront jamais utilisés en dehors de MotherActivity) - c'est facile, ajoutez simplement à l'intérieur de la classe java MotherActivity autant de fragments que vous le souhaitez, comme ceci:
Donc, pour transmettre des données de la MotherActivity à un tel fragment, vous devrez créer des chaînes / bundles privés au-dessus de l'activité onCreate de votre mère - que vous pouvez remplir avec les données que vous souhaitez transmettre aux fragments et les transmettre via un méthode créée après le onCreate (ici appelé getMyData ()).
Et puis dans la classe fragment, vous utilisez getMyData:
Si vous avez des requêtes de base de données, je vous conseille de les faire dans MotherActivity (et de passer leurs résultats sous forme de chaînes / entiers attachés aux clés dans un bundle comme indiqué ci-dessus), comme dans les fragments tabulés, votre syntaxe deviendra plus complexe (cela devient getActivity () par exemple, et getIntent devient getActivity (). getIntent), mais vous avez également la possibilité de faire ce que vous voulez.
Mon conseil pour les débutants est de se concentrer sur de petites étapes. Tout d'abord, obtenez votre intention d'ouvrir une activité à onglets très simple, sans transmettre de données. Est-ce que ça marche? Ouvre-t-il les onglets que vous attendez? Sinon, pourquoi?
Commencez par cela, et en appliquant des solutions telles que celles présentées dans ce clip , voyez ce qui manque. Pour ce clip particulier, le fichier mainactivity.xml n'est jamais affiché. Cela vous troublera sûrement. Mais si vous faites attention, vous verrez que par exemple le contexte (tools: context) est incorrect dans les fichiers de fragments xml. Chaque fragment XML doit pointer vers la classe de fragment correcte (ou sous-classe à l'aide du séparateur $).
Vous verrez également que dans la classe java d'activité principale, vous devez ajouter tabLayout.setupWithViewPager (mViewPager) - juste après la ligne TabLayout tabLayout = (TabLayout) findViewById (R.id.tabs); sans cette ligne, votre vue n'est en fait pas liée aux fichiers XML des fragments, mais elle affiche UNIQUEMENT le fichier xml de l'activité principale.
En plus de la ligne de la classe java d'activité principale, dans le fichier XML d'activité principale, vous devez modifier les onglets en fonction de votre situation (par exemple, ajouter ou supprimer des TabItems). Si vous n'avez pas d'onglets dans le XML d'activité principal, vous n'avez peut-être pas choisi le type d'activité correct lorsque vous l'avez créé en premier lieu (nouvelle activité - activité à onglets).
Veuillez noter que dans les 3 derniers paragraphes je parle de la vidéo! Donc, quand je dis XML d'activité principale, c'est le XML d'activité principale dans la vidéo, qui dans votre situation est le fichier XML MotherActivity.
la source
Si vous transmettez une référence au fragment (sous-classe concrète de) dans la tâche asynchrone, vous pouvez alors accéder directement au fragment.
Quelques façons de passer la référence de fragment dans la tâche asynchrone:
class FooTask extends AsyncTask
), passez votre fragment au constructeur.la source
Parfois, vous pouvez recevoir Intent dans votre activité et vous devez transmettre les informations à votre fragment de travail.
Les réponses données sont correctes si vous devez démarrer le fragment mais s'il fonctionne toujours, ce
setArguments()
n'est pas très utile.Un autre problème se produit si les informations transmises provoquent une interaction avec votre interface utilisateur. Dans ce cas, vous ne pouvez pas appeler quelque chose comme,
myfragment.passData()
car Android vous dira rapidement que seul le thread qui a créé la vue peut interagir.Donc, ma proposition est d'utiliser un récepteur. De cette façon, vous pouvez envoyer des données de n'importe où, y compris l'activité, mais le travail se fera dans le contexte du fragment.
En vous fragmentez
onCreate()
:Dans votre activité:
la source
Très vieux post, j'ose encore ajouter une petite explication qui m'aurait été utile.
Techniquement, vous pouvez définir directement des membres de tout type dans un fragment d'activité.
Alors pourquoi Bundle?
La raison est très simple - Bundle fournit un moyen uniforme de gérer:
- la création / ouverture d'un fragment
- la reconfiguration (rotation de l'écran) - il suffit d'ajouter le bundle initial / mis à jour à outState dans onSaveInstanceState ()
- la restauration de l'application après avoir été récupérée en arrière-plan ( comme pour la reconfiguration).
Vous pouvez (si vous aimez les expériences) créer une solution de contournement dans des situations simples, mais l'approche Bundle ne voit tout simplement pas la différence entre un fragment et mille sur un backstack - elle reste simple et directe.
C'est pourquoi la réponse de @Elenasys est la solution la plus élégante et universelle.
Et c'est pourquoi la réponse donnée par @Martin a des pièges
la source
la meilleure approche pour envoyer des données de la classe d'activité au fragment passe par des méthodes de définition. Comme
et obtenir facilement ces données de la classe.
la source
De
Activity
vous envoyez des données avec Bundle en tant que:Et dans la
Fragment
méthode onCreateView, obtenez les données:la source
Si an
activity
doitfragment
effectuer une action après l'initialisation, la méthode la plus simple consiste àactivity
invoquer une méthode sur l'fragment
instance. Dans lefragment
, ajoutez une méthode:puis dans le
activity
, accédez à l'fragment
aide dufragment
gestionnaire et appelez lemethod
:puis le
activity
peut communiquer directement avec lefragment
en l'invoquantmethod
.la source
onCreateView
méthode dans le fragment. était vraiment utileUtilisez l'interface suivante pour communiquer entre l'activité et le fragment
Ou utilisez le suivi de cet écouteur générique pour une communication bidirectionnelle à l'aide de l'interface
fragment show method
vous pouvez lancer votre contexte
GenericConnector
dansonAttach(Context)
tropdans votre activité
dans ton fragment
Remarque: ne l'utilisez jamais comme un
"".toString().toString().toString();
moyen.la source
vient de tomber sur cette question, alors que la plupart des méthodes ci-dessus fonctionneront. Je veux juste ajouter que vous pouvez utiliser la bibliothèque de bus d'événements , en particulier dans les scénarios où le composant (activité ou fragment) n'a pas été créé, il convient à toutes les tailles de projets Android et à de nombreux cas d'utilisation. Je l'ai personnellement utilisé dans plusieurs projets que j'ai sur Playstore.
la source
Vous pouvez créer une méthode statique publique dans un fragment où vous obtiendrez une référence statique de ce fragment, puis transmettre des données à cette fonction et définir ces données sur argument dans la même méthode et obtenir des données via getArgument sur la méthode oncreate de fragment, et définir ces données sur local variables.
la source
La façon la plus intelligente et la plus éprouvée de transmettre des données entre les fragments et l'activité consiste à créer des variables, par exemple:
Ensuite, pour passer des données d'un fragment à une activité, nous le faisons dans la méthode onActivityCreated:
Maintenant, vous pouvez obtenir la valeur de StorageUtil.employees de partout. Bonne chance!
la source
Ma solution est d'écrire une méthode statique à l'intérieur du fragment:
De cette façon, je suis sûr que toutes les données dont j'ai besoin se trouvent à l'intérieur du fragment avant toute autre opération possible qui pourrait avoir besoin de fonctionner avec. De plus, il a l'air plus propre à mon avis.
la source
J'ai rencontré un problème similaire lors de l'utilisation du dernier composant d'architecture de navigation. J'ai essayé tout le code mentionné ci-dessus en passant un paquet de mon activité d'appel à Fragment.
La meilleure solution, en suivant les dernières tendances de développement d'Android, est d'utiliser View Model (qui fait partie d'Android Jetpack).
Créez et initialisez une classe ViewModel dans l'activité parent. Veuillez noter que ce ViewModel doit être partagé entre l'activité et le fragment.
Maintenant, à l'intérieur de onViewCreated () du fragment, initialisez le même ViewModel et configurez les observateurs pour écouter les champs ViewModel.
Voici un tutoriel utile et approfondi si vous en avez besoin.
https://medium.com/mindorks/how-to-communicate-between-fragments-and-activity-using-viewmodel-ca733233a51c
la source
Dans votre activité, déclarez une variable statique
Ensuite, dans votre fragment, aimez suivre
la source