Envoyer des données à partir de l'activité de fragment dans Android
J'ai deux classes. La première est l'activité, le second est un fragment où j'ai quelques EditText
. Dans l'activité que j'ai une sous-classe avec async-tâche et dans la méthode doInBackground
- je obtenir un résultat, qui, je l'enregistrer dans une variable. Comment puis-je envoyer cette variable à partir de la sous-classe "mon activité" de ce fragment?
Vous devez vous connecter pour publier un commentaire.
D'Activité vous permet d'envoyer des données à l'intention de:
et du Fragment onCreateView méthode:
getArguments().getString(key)
startActivityForResult
méthode et remplaceronActivityResult
en Activité dans laquelle le Fragment est Ajouté. pour obtenir des données deonActivityResult
de Fragment de créer une méthode dans le Fragment et de l'appeler en utilisant le même objet qui ont u utilisé pour l'ajout d'un Fragment dans FragmentManager<fragment android:name="com.picker.PickerListFragment"
?? Comment peut-on envoyer des données à partirActivity
à cePickerListFragment
??onCreateView
n'est pas appelé pour la suite des références de fragments? donc, il ne fonctionne que la première foisAussi, Vous pouvez accéder à des données d'activité de fragment:
Activité:
Fragment:
Bundle
classe pour transmettre les informations. Sinon, vous pouvez faire quegetMyData()
méthode héritée et mis en œuvre à partir d'une interface et laFragment
vérifier si getActivity retourne uninstanceof
l'Interface enonAttach()
.Ive trouvé beaucoup de réponses ici @ stackoverflow.com mais certainement c'est la bonne réponse de:
"Envoi de données à partir de l'activité de fragment dans android".
Activité:
Fragment:
La lecture de la valeur dans le fragment
ou tout simplement
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 à partir de l'intention. et fichier sélectionné pour être passé à particulier fragment pour la poursuite du processus. j'ai beaucoup de fragments ayant les fonctionnalités de Fichier de la cueillette. à l'époque , à chaque fois que la vérification de l'état et d'obtenir le fragment et passer la valeur est assez dégueulasse. donc , j'ai décidé de passer la valeur à l'aide de l'interface.
Étape 1: Créer l'interface sur l'Activité Principale.
Étape 2: Créer le SelectedBundle de référence sur la Même Activité
Étape 3: créer de la Méthode dans la Même Activité
Étape 4: Besoin d'initialiser le SelectedBundle de référence qui sont tous les fragments doivent filepicker fonctionnalité.Vous placez ce code sur votre fragment
onCreateView(..)
méthodeÉtape 5: onActivityResult de la MainActivity, transmettre les valeurs de l'fragments à l'aide de l'interface.
C'est tout. Mettre en œuvre chaque fragment vous avez besoin sur le FragmentClass. Vous êtes grand. vous l'avez fait. WOW...
Idée de base de l'utilisation de Fragments (F) est de créer réutilisables autonomes composants de l'INTERFACE utilisateur dans les applications android. Ces Fragments sont contenus dans les activités et les communes sont là(la meilleure) façon de créer une voie de communication de manières d'Un -> F et F-A, Il est un must pour Communiquer entre F-F à travers une Activité parce qu'alors seulement les Fragments découplés et autonome.
Afin de transmettre les données à partir d'Un -> F est le même, comme expliqué par ρяσѕρєя K. En outre, la réponse à cette question, Après la création des Fragments à l'intérieur d'une Activité, nous pouvons également transmettre des données aux fragments de l'appel de méthodes dans les Fragments.
Par exemple:
La meilleure approche pratique et appelle fragment d'instance et d'envoyer des données à l'époque.
chaque fragment par défaut ont de la méthode d'instance
si vous appelez votre fragment de l'activité de ce genre :
*R. id.le conteneur est un id de mon FrameLayout
donc dans MyFragment.newInstance("data1","data2") vous pouvez envoyer des données fragment et dans votre fragment que vous obtenir ces données dans MyFragment newInstance(String param1, Chaîne param2)
puis dans onCreate méthode de fragment que vous obtiendrez les données:
Si vous passez une référence à la (sous-classe concrète de) fragment dans le async tâche, vous pouvez alors accéder à l'fragment directement.
Quelques façons de passer le fragment de référence dans l'async task:
class FooTask extends AsyncTask
), puis de passer votre fragment dans le constructeur.Je voudrais ajouter pour les débutants que la différence entre les 2 plus upvoted réponses ici est donné par l'utilisation différente d'un fragment.
Si vous utilisez le fragment à l'intérieur de la classe java où vous avez les données que vous souhaitez passer, vous pouvez appliquer la première réponse à passer des données:
Toutefois, si vous utilisez par exemple le code par défaut donné par Android Studio pour les onglets des fragments, ce code ne fonctionnera pas.
Il ne fonctionnera pas, même si vous remplacez la valeur par défaut PlaceholderFragment avec votre FragmentClasses, et même si vous corrigez les FragmentPagerAdapter à la nouvelle situation de l'ajout d'un interrupteur pour la getItem() et un autre interrupteur pour getPageTitle() (comme illustré ici)
Avertissement: le clip ci-dessus a les erreurs dans le code, que j'expliquerai plus tard ici, mais il est utile de voir comment vous allez de code par défaut modifiable code pour les onglets fragments)! Le reste de ma réponse fait beaucoup plus de sens si l'on considère les classes java et des fichiers xml à partir de ce clip (représentant pour une première utilisation des onglets de fragments par un débutant scénario).
La principale raison pour laquelle la plupart des upvoted réponse à partir de cette page ne fonctionnera pas, c'est que dans ce code par défaut pour les onglets des fragments, des 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 le MotherActivity et le faire passer dans le FragmentPagerAdapter, à l'aide de répondre non.2.
Seulement c'est faux encore une fois. (Probablement vous pourriez le faire comme ça, mais c'est juste une complication qui n'est pas vraiment nécessaire).
Le bon/moyen plus facile de le faire, je pense, est de transmettre les données directement sur le fragment en question, à l'aide de répondre non.2.
Oui, il y aura un couplage étroit entre l'Activité et le Fragment, MAIS, pour les onglets de fragments, qui est une sorte de prévu. J'irais même jusqu'à vous conseiller de créer les onglets des fragments à l'intérieur de la MotherActivity classe java (comme les sous-classes, comme ils ne seront jamais utilisées à l'extérieur de la MotherActivity) - c'est facile, il suffit d'ajouter à l'intérieur de la MotherActivity classe java comme de nombreux Fragments que vous avez besoin, comme ceci:
Donc, pour transmettre des données à partir de la MotherActivity à un tel Fragment que vous aurez besoin pour créer des Chaînes privées/Bundles ci-dessus le onCreate de votre Mère activité que vous pouvez remplir avec les données que vous souhaitez passer à l'fragments, et de les transmettre par l'intermédiaire d'une méthode créée après le onCreate (appelé ici getMyData()).
Et puis dans le fragment de la classe, vous utilisez getMyData:
Si vous avez des requêtes de base de données, je vous conseille de les faire dans le MotherActivity (et de transmettre leurs résultats comme des Chaînes de caractères/Entiers attaché à vos clés à l'intérieur d'un bundle comme indiqué ci-dessus), à l'intérieur des onglets de fragments, votre syntaxe deviendra de plus en plus complexe (cela devient getActivity() par exemple, et getIntent devient getActivity().getIntent), mais vous avez également l'option de faire comme vous le souhaitez.
Mes conseils pour les débutants est de se concentrer sur les petites étapes. Tout d'abord, obtenir votre intention d'ouvrir un très simple à onglets activité, sans que la transmission des données. Cela fonctionne? Ne l'ouvrez les onglets que vous attendez? Si non, pourquoi?
Démarrer à partir de celui, et en appliquant des solutions telles que celles présentées dans ce clip, voir ce qui est manquant. Pour ce clip en particulier, l'mainactivity.xml n'est jamais montré. Qui va sûrement vous confondre. Mais si vous faites attention, vous verrez que, par exemple, le contexte (outils:contexte) ne l'est pas dans le fragment xml fichiers. Chaque fragment XML doit pointer vers le bon fragment de la classe (ou sous-classe en utilisant le séparateur $).
Vous verrez également que l'activité principale de classe java, vous devez ajouter tabLayout.setupWithViewPager(mViewPager) - à droite après la ligne TabLayout tabLayout = (TabLayout) findViewById(R. id.onglets); sans cette ligne, votre vue est en fait pas lié à des fichiers XML des fragments, mais il ne montre que le fichier xml de l'activité principale.
En plus de la ligne l'activité principale de java de la classe, l'activité principale de fichier XML, vous devez changer les onglets pour s'adapter à votre situation (par exemple, ajouter ou supprimer TabItems). Si vous n'avez pas les onglets dans l'activité principale XML, alors peut-être vous n'avez pas choisi le bon type d'activité lorsque vous avez créé dans la première place (nouvelle activité - onglets de l'activité).
Veuillez noter que dans les 3 derniers paragraphes que je parle de la vidéo! Donc, quand je dis l'activité principale du XML, c'est l'activité principale de XML dans la vidéo, qui, dans votre situation, c'est le MotherActivity fichier XML.
Très vieux post, encore, j'ose ajouter un peu d'explication qui aurait été utile pour moi.
Techniquement, vous pouvez régler directement les membres de n'importe quel type dans un fragment de l'activité.
Alors pourquoi Bundle?
La raison en est très simple - Bundle fournit de façon uniforme à la poignée:
-- création/d'ouverture fragment
-- reconfiguration à la rotation de l'écran) - il suffit d'ajouter l'initiale/mis à jour bundle pour outState dans onSaveInstanceState()
-- application de la restauration après avoir été nettoyés à fond (comme avec la reconfiguration).
Vous pouvez (si vous aimez les expériences) créer une solution de contournement dans des situations simples mais Bundle-approche n'est tout simplement pas voir la différence entre un fragment et un mille sur une backstack - il reste simple et directe.
C'est pourquoi la réponse par @Elenasys est la plus élégante et la solution universelle.
Et c'est pourquoi la réponse donnée par @Martin a pièges
De
Activity
vous envoyez des données avec Bundle:Et dans
Fragment
onCreateView méthode d'obtenir les données:la meilleure approche pour l'envoi de données à partir de l'activité de la classe de fragment est en passant par les méthodes de définition. Comme
et obtenir ces données à partir de la classe facilement.
Parfois, vous pouvez recevoir de l'Intention dans votre activité et vous avez besoin de passer l'info à votre travail fragment.
Donné les réponses sont OK si vous avez besoin pour commencer le fragment, mais si il marche encore,
setArguments()
n'est pas très utile.Un autre problème se produit si le passé de l'information permettra d'interagir avec votre INTERFACE utilisateur. Dans ce cas, vous ne pouvez pas appeler quelque chose comme
myfragment.passData()
parce qu'android va rapidement dit que seul le thread qui a créé la vue peut interagir avec.Donc ma proposition est d'utiliser un récepteur. De cette façon, vous pouvez envoyer des données à partir de n'importe où, y compris l'activité, mais le travail sera réalisé dans le fragment du contexte.
Dans vous du fragment
onCreate()
:En activité:
Si un
activity
besoin de faire unfragment
effectuer une action après l'initialisation, le plus simple est d'avoir leactivity
invoquer une méthode sur lafragment
instance. Dans lefragment
, ajoutez une méthode:et puis dans le
activity
, obtenir l'accès à lafragment
à l'aide de lafragment
gestionnaire et d'appeler lamethod
:et puis le
activity
pouvez communiquer directement avec lefragment
en invoquant cemethod
.onCreateView
méthode dans le fragment. a été vraiment utileVous pouvez créer de la méthode statique publique du fragment où vous aurez statique de référence de ce fragment, puis de transmettre les données de la fonction et de définir les données à l'argument de la même méthode et d'obtenir des données via getArgument sur la méthode oncreate de fragment, et l'ensemble des données pour les variables locales.
Plus intelligent essayé et testé façon de transmettre des données entre des fragments et de l'activité est de créer des variables,par exemple:
Puis de transmettre les données à partir de fragment d'activité, nous le faisons dans le onActivityCreated méthode:
Maintenant, vous pouvez obtenir la valeur de StorageUtil.les employés de partout.
Goodluck!
Utiliser l'interface suivante pour communiquer entre l'activité et le fragment
Ou de l'utiliser à la suite de cet écouteur générique pour la communication dans les deux sens à l'aide de l'interface
fragment de méthode show
vous pouvez lancer votre contexte de
GenericConnector
dansonAttach(Context)
tropdans votre activité
dans votre fragment
Remarque: ne Jamais l'utiliser comme
"".toString().toString().toString();
façon.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 est à l'intérieur du Fragment avant toute autre opération qui pourrait avoir besoin de travailler avec elle.
En outre, il semble plus propre à mon avis.
J'ai rencontré un problème similaire lors de l'utilisation de la dernière architecture de Navigation composant. Essayé tous les code susmentionné avec le passage d'un faisceau de ma vocation de l'activité de Fragment.
La meilleure solution, en suivant les dernières tendances en matière de développement sous Android, est par l'utilisation de Modèle de Vue (partie d'Android Jetpack).
De créer et d'Initialiser un ViewModel de la classe dans le parent de l'Activité, Veuillez noter que ce Dernier doit être partagée entre l'activité et le fragment.
Maintenant, à l'Intérieur de la onViewCreated() du fragment, Initialiser le Même ViewModel et l'installation des Observateurs pour écouter la ViewModel champs.
Ici est un utile, en profondeur tutoriel si vous avez besoin d'.
https://medium.com/mindorks/how-to-communicate-between-fragments-and-activity-using-viewmodel-ca733233a51c
juste trébuché à travers cette question, alors que la plupart des méthodes ci-dessus fonctionne.
Je tiens juste à ajouter que vous pouvez utiliser le Événement De Bus De La Bibliothèque, en particulier dans les scénarios où le composant (Activité ou Fragment) n'a pas été créé, il est bon pour toutes les tailles de projets android et de nombreux cas d'utilisation. J'ai personnellement utilisé dans plusieurs projets que j'ai sur le playstore.
Dans votre activité de déclarer une variable statique
Puis dans votre fragment de faire comme suivre