J'utilise DialogFragments pour un certain nombre de choses: choisir un élément dans la liste, saisir du texte.
Quelle est la meilleure façon de renvoyer une valeur (c'est-à-dire une chaîne ou un élément d'une liste) à l'activité / au fragment appelant?
Actuellement, je fais implémenter l'activité d'appel DismissListener
et donne au DialogFragment une référence à l'activité. La boîte de dialogue appelle ensuite la OnDimiss
méthode dans l'activité et l'activité récupère le résultat de l'objet DialogFragment. Très désordonné et cela ne fonctionne pas sur le changement de configuration (changement d'orientation) car DialogFragment perd la référence à l'activité.
Merci pour toute aide.
Activity
et leDialogFragment
peuvent être recréés. L'utilisation duActivity
passé àonAttach(Activity activity)
est la manière appropriée et recommandée.Réponses:
Utilisez à
myDialogFragment.setTargetFragment(this, MY_REQUEST_CODE)
partir de l'endroit où vous affichez la boîte de dialogue, puis lorsque votre boîte de dialogue est terminée, vous pouvez l'appelergetTargetFragment().onActivityResult(getTargetRequestCode(), ...)
et l'implémenteronActivityResult()
dans le fragment contenant.Cela semble être un abus
onActivityResult()
, d'autant plus qu'il n'implique aucune activité. Mais je l'ai vu recommandé par les responsables officiels de Google, et peut-être même dans les démos de l'API. Je pense que c'est ce qui ag/setTargetFragment()
été ajouté.la source
Comme vous pouvez le voir ici, il existe un moyen très simple de le faire.
Dans votre
DialogFragment
ajouter un écouteur d'interface comme:Ensuite, ajoutez une référence à cet écouteur:
Cela sera utilisé pour "activer" la ou les méthodes d'écoute, et également pour vérifier si l'activité / le fragment parent implémente cette interface (voir ci-dessous).
Dans le
Activity
/FragmentActivity
/Fragment
qui "appelé",DialogFragment
implémentez simplement cette interface.Dans votre
DialogFragment
tout, vous devez ajouter au point où vous souhaitez supprimer leDialogFragment
et renvoyer le résultat est le suivant:Où
mEditText.getText().toString()
est ce qui sera renvoyé à l'appelActivity
.Notez que si vous souhaitez renvoyer autre chose, changez simplement les arguments pris par l'auditeur.
Enfin, vous devez vérifier si l'interface a été réellement implémentée par l'activité / le fragment parent:
Cette technique est très flexible et permet de rappeler le résultat même si vous ne souhaitez pas fermer la boîte de dialogue pour l'instant.
la source
Activity
'etFragmentActivity
' mais si l'appelant est-il unFragment
?Fragment
.Fragment
alors vous pouvez faire quelques choses: 1. Passez le fragment comme référence (Ce n'est peut-être pas une bonne idée car vous pourriez provoquer des fuites de mémoire). 2. Utilisez leFragmentManager
et appelezfindFragmentById
oufindFragmentByTag
il obtiendra les fragments qui existent dans votre activité. J'espère que cela a aidé. Passez une bonne journée!setTargetFragment()
etgetTargetFragment()
sont magiques.Il existe un moyen beaucoup plus simple de recevoir un résultat d'un DialogFragment.
Tout d'abord, dans votre activité, fragment ou activité de fragment, vous devez ajouter les informations suivantes:
C'est
requestCode
fondamentalement votre étiquette int pour le DialogFragment que vous avez appelé, je vais montrer comment cela fonctionne dans une seconde. Le resultCode est le code que vous renvoyez du DialogFragment indiquant à votre Activity, Fragment ou FragmentActivity en attente ce qui s'est passé.Le morceau de code suivant à entrer est l'appel au DialogFragment. Un exemple est ici:
Avec ces trois lignes, vous déclarez votre DialogFragment, définissez un requestCode (qui appellera onActivityResult (...) une fois la boîte de dialogue fermée et vous affichez ensuite la boîte de dialogue. C'est aussi simple que cela.
Maintenant, dans votre DialogFragment, vous devez simplement ajouter une ligne juste avant le
dismiss()
afin de renvoyer un resultCode au onActivityResult ().C'est tout. Remarque, le resultCode est défini comme
int resultCode
celui que j'ai définiresultCode = 1;
dans ce cas.Voilà, vous pouvez maintenant renvoyer le résultat de votre DialogFragment à votre activité d'appel, fragment ou activité de fragment.
De plus, il semble que ces informations aient été publiées précédemment, mais aucun exemple suffisant n'a été donné, j'ai donc pensé fournir plus de détails.
EDIT 06.24.2016 Je m'excuse pour le code trompeur ci-dessus. Mais vous ne pouvez certainement pas recevoir le résultat de l'activité en tant que ligne:
fixe un objectif
Fragment
et nonActivity
. Donc, pour ce faire, vous devez utiliser implémenter unInterfaceCommunicator
.Dans votre
DialogFragment
ensemble une variable globaleCréer une fonction publique pour la gérer
Ensuite , lorsque vous êtes prêt à envoyer le dos de code à
Activity
quand l'DialogFragment
est fait en cours d' exécution, vous ajoutez simplement la ligne avantdismiss();
votreDialogFragment
:Dans votre activité, vous devez maintenant faire deux choses, la première consiste à supprimer cette seule ligne de code qui n'est plus applicable:
Ensuite, implémentez l'interface et vous avez terminé. Vous pouvez le faire en ajoutant la ligne suivante à la
implements
clause tout en haut de votre classe:Et puis
@Override
la fonction dans l'activité,Vous utilisez cette méthode d'interface comme vous le feriez pour la
onActivityResult()
méthode. Sauf que la méthode d'interface est pourDialogFragments
et l'autre est pourFragments
.la source
dialogFrag.setTargetFragment(this, 1)
partir d'une activité, mais cette méthode reçoit un fragment comme premier argument, donc cela n'a pas pu être lancé. Ai-je raison ?@Override public void onAttach(Context context) { super.onAttach(context); yourInterface = (YourInterface) context; }
Il est peut-être trop tard pour répondre, mais voici ce que j'ai fait pour obtenir des résultats de la
DialogFragment
. très similaire à la réponse de @ brandon. Ici, j'appelle àDialogFragment
partir d'un fragment, placez simplement ce code là où vous appelez votre boîte de dialogue.où
categoryDialog
est monDialogFragment
que je veux appeler et après cela dans votre implémentation dedialogfragment
placer ce code où vous définissez vos données dans l'intention. La valeur deresultCode
est 1, vous pouvez la définir ou utiliser Défini par le système.il est maintenant temps de revenir au fragment appelant et d'implémenter cette méthode. vérifiez la validité des données ou la réussite des résultats si vous le souhaitez avec
resultCode
etrequestCode
dans la condition if.la source
Approche différente, pour permettre à un Fragment de communiquer jusqu'à son Activité :
1) Définissez une interface publique dans le fragment et créez une variable pour celle-ci
2) Cast l'activité sur la variable mCallback dans le fragment
3) Implémentez l'auditeur dans votre activité
4) Remplacer l'interaction OnFragment dans l'activité
Plus d'informations à ce sujet: https://developer.android.com/training/basics/fragments/communicating.html
la source
public void onAttach
le fragment et de faire le casting d'activitéUn moyen simple que j'ai trouvé était le suivant: implémentez ceci est votre dialogFragment,
Et puis, dans l'activité qui a appelé le fragment de dialogue, créez la fonction appropriée en tant que telle:
Le Toast est de montrer que cela fonctionne. A travaillé pour moi.
la source
Interface
plutôt que couplage dur avec des classes concrètes.Je suis très surpris de voir que personne ne l'a suggéré d' utiliser des émissions locales pour
DialogFragment
laActivity
communication! Je trouve que c'est tellement plus simple et plus propre que les autres suggestions. Essentiellement, vous vous inscrivez pourActivity
écouter les émissions et vous envoyez les émissions locales à partir de vosDialogFragment
instances. Facile. Pour un guide étape par étape sur la façon de tout configurer, voir ici .la source
Ou partagez ViewModel comme montré ici:
https://developer.android.com/topic/libraries/architecture/viewmodel#sharing_data_between_fragments
la source
Dans mon cas, j'avais besoin de passer des arguments à un targetFragment. Mais j'ai eu l'exception "Fragment déjà actif". J'ai donc déclaré une interface dans mon DialogFragment que parentFragment a implémenté. Lorsque parentFragment a démarré un DialogFragment, il s'est défini comme TargetFragment. Puis dans DialogFragment j'ai appelé
la source
À Kotlin
// Mon activité
J'espère que cela sert, si vous pouvez l'améliorer, veuillez le modifier. Mon anglais n'est pas très bon
la source
si vous souhaitez envoyer des arguments et recevoir le résultat du deuxième fragment, vous pouvez utiliser Fragment.setArguments pour accomplir cette tâche
la source
Juste pour l'avoir comme l'une des options (puisque personne ne l'a encore mentionné) - vous pouvez utiliser un bus d'événements comme Otto. Donc, dans la boîte de dialogue, vous faites:
Et demandez à votre correspondant (Activité ou Fragment) de s'y abonner:
la source