245 votes

Recevoir le résultat de DialogFragment

Je suis à l'aide de DialogFragments pour un certain nombre de choses: le choix de l'élément de la liste, la saisie de texte.

Quelle est la meilleure façon de retourner une valeur (c'est à dire une chaîne de caractères ou un élément d'une liste) retour à l'appel de l'activité/fragment?

Actuellement, je suis en train de l'appeler de l'activité mettre en œuvre DismissListener et de donner de l'DialogFragment une référence à l'activité. La boîte de Dialogue, puis appelle la OnDimiss méthode dans l'activité et l'activité attrape le résultat de la DialogFragment objet. Très salissant et il ne fonctionne pas sur le changement de configuration (changement d'orientation) comme le DialogFragment perd la référence à l'activité.

Merci pour toute aide.

259voto

Timmmm Points 9909

Utilisation de l’endroit où vous affichez la boîte de dialogue et puis quand votre dialogue est terminé, il vous pouvez appeler et mettre en place `` dans le fragment contenant.

Il semble comme un abus de , autant qu’il n’implique pas à toutes les activités. Mais je l’ai vu recommandé par google officiel personnes et peut-être même dans les démos de l’api. Je pense que c’est ce que ont été ajoutés pour.

142voto

Assaf Gamliel Points 4792

Comme vous pouvez le voir ici, il y a un moyen très simple de le faire.

Dans votre DialogFragment ajouter une interface listener comme:

public interface EditNameDialogListener {
    void onFinishEditDialog(String inputText);
}

Dans l' Activity/FragmentActivity/Fragment "appelé" l' DialogFragment simplement d'implémenter cette interface.

Dans votre DialogFragment tout ce que vous devez ajouter à l'endroit où vous souhaitez rejeter l' DialogFragment et de retourner le résultat est le suivant:

EditNameDialogListener activity = (EditNameDialogListener) getActivity();
activity.onFinishEditDialog(mEditText.getText().toString());
this.dismiss();

mEditText.getText().toString() est ce qui va être transmis à l'appelant Activity.

Notez que si vous voulez retourner à quelque chose d'autre tout simplement en modifier les arguments de l'auditeur prend.

Cette technique est très flexible et permettent d'appeler en arrière, avec le résultat, même si vos ne t veulent fermer la boîte de dialogue pour l'instant.

52voto

Brandon Points 16

Il y a un moyen beaucoup plus simple pour un résultat à partir d'un DialogFragment.

Tout d'abord, dans votre Activité, Fragment, ou FragmentActivity vous devez ajouter les informations suivantes:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) 
{
    // Stuff to do, dependent on requestCode and resultCode
    if(requestCode == 1)  // 1 is an arbitrary number, can be any int
    {
         // This is the return result of your DialogFragment
         if(resultCode == 1) // 1 is an arbitrary number, can be any int
         {
              // Now do what you need to do after the dialog dismisses.
         }
     }
}

L' requestCode est en fait votre int de l'étiquette de la DialogFragment vous appelle, je vais vous montrer comment cela fonctionne dans une seconde. Le resultCode est le code que vous renvoyer à partir de la DialogFragment en parler à votre attente actuelle de l'Activité, Fragment, ou FragmentActivity ce qui s'est passé.

Le prochain morceau de code est l'appel à la DialogFragment. Un exemple est ici:

DialogFragment dialogFrag = new MyDialogFragment();
// This is the requestCode that you are sending.
dialogFrag.setTargetFragment(this, 1);     
// This is the tag, "dialog" being sent.
dialogFrag.show(getFragmentManager(), "dialog");

Avec ces trois lignes que vous déclarez votre DialogFragment, la définition d'une requestCode (qui va appeler le onActivityResult(...) une fois que la boîte de Dialogue est fermée, et vous êtes alors en montrant la boîte de dialogue. C'est aussi simple que cela.

Maintenant, dans votre DialogFragment vous suffit d'ajouter une ligne, directement auprès de l' dismiss() , de sorte que vous envoyez un resultCode retour à la onActivityResult().

getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, getActivity().getIntent());
dismiss();

C'est tout. Remarque, le resultCode est défini comme int resultCode que j'ai défini pour resultCode = 1; dans ce cas.

Voilà, vous pouvez maintenant envoyer le résultat de vos DialogFragment de retour à l'appel de l'Activité, Fragment, ou FragmentActivity.

Aussi, il ressemble cette information a été publiée auparavant, mais il n'y avait pas suffisamment exemple donné j'ai donc pensé que je pourrais fournir plus de détails.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X