121 votes

Voir la boîte de dialogue de fragment ?

J'ai quelques fragments qui ont besoin de montrer un dialogue régulier. Sur ces boîtes de dialogue, l'utilisateur peut choisir une réponse oui/non, et puis le fragment doit se comporter en conséquence.

Maintenant, l' Fragment de la classe n'a pas d' onCreateDialog() méthode pour remplacer, donc je suppose que je dois mettre en œuvre les boîtes de dialogue à l'extérieur, dans le contenant Activity. C'est ok, mais alors l' Activity des besoins de rapporter la réponse choisie en quelque sorte le fragment. Je pourrais bien sûr utiliser un callback modèle ici, de sorte que le fragment s'enregistre lui-même à l' Activity avec un écouteur de classe, et l'Activité de rapporter la réponse thru, ou quelque chose comme ça.

Mais ce qui semble être tout à fait un grand gâchis pour une tâche simple que l'affichage d'un putain de oui-pas de dialogue dans un fragment. Aussi, de cette façon, mon Fragment serait de moins en moins autonome.

Est-il une manière plus propre de faire cela?

Edit:

La réponse à cette question n'a pas vraiment l'expliquer en détail comment on doit utiliser DialogFragments pour afficher les boîtes de dialogue à partir de Fragments. Donc, autant que je sache, la voie à suivre est:

  1. Affichage d'un Fragment.
  2. Si nécessaire, instancier un DialogFragment.
  3. Définir le Fragment d'origine en tant que cible de cette DialogFragment, .setTargetFragment().
  4. Afficher la DialogFragment avec .show() à partir du Fragment initial.
  5. Lorsque l'utilisateur choisit une option sur ce DialogFragment, aviser le Fragment d'origine sur cette sélection (par exemple, l'utilisateur a cliqué sur "oui"), vous pouvez obtenir la référence du Fragment initial .getTarget().
  6. Rejeter la DialogFragment.

38voto

Mark D Points 1759

Je dois douter prudemment la réponse précédemment acceptée qu’à l’aide d’un DialogFragment est la meilleure option. La destination (primaire) de la DialogFragment semble être pour afficher des fragments qui sont eux-mêmes, ne pas d’afficher des boîtes de dialogue des fragments qui ont des boîtes de dialogue à afficher.

Je crois qu’à l’aide de l’activité du fragment médiation entre le dialogue et le fragment est la meilleure option.

37voto

mgv Points 4250

Vous devez plutôt utiliser un DialogFragment .

24voto

Warpzit Points 11150

Voici un exemple complet d'un oui/non DialogFragment:

La classe:

public class SomeDialog extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new AlertDialog.Builder(getActivity())
            .setTitle("Title")
            .setMessage("Sure you wanna do this!")
            .setNegativeButton(android.R.string.no, new OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // do nothing (will close dialog)
                }
            })
            .setPositiveButton(android.R.string.yes,  new OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // do something
                }
            })
            .create();
    }
}

Pour démarrer le dialogue:

        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        // Create and show the dialog.
        SomeDialog newFragment = new SomeDialog ();
        newFragment.show(ft, "dialog");

Vous pouvez également laisser la classe de mettre en œuvre onClickListener et l'utiliser à la place de l'embedded auditeurs.

Rappel à l'Activité

Si vous voulez mettre en œuvre de rappel c'est comment il est fait Dans votre activité:

YourActivity extends Activity implements OnFragmentClickListener

et

@Override
public void onFragmentClick(int action, Object object) {
    switch(action) {
        case SOME_ACTION:
        //Do your action here
        break;
    }
}

La classe de rappel:

public interface OnFragmentClickListener {
    public void onFragmentClick(int action, Object object);
}

Ensuite, pour effectuer un rappel à partir d'un fragment que vous devez vous assurer que l'auditeur est fixé comme ceci:

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    try {
        mListener = (OnFragmentClickListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString() + " must implement listeners!");
    }
}

Et un rappel est effectué comme ceci:

mListener.onFragmentClick(SOME_ACTION, null); // null or some important object as second parameter.

13voto

Zhuinden Points 3074

Pour moi, c’était ce qui suit-

MyFragment :

MyDialog :

Activité :

DialogFragment mise en page :

Comme le nom de montre, je ne pouvais pas juste trouver un moyen de fixer que hauteur du bouton bas a été coupé en deux malgré , alors j’ai ajouté un bouton caché à « couper » en deux à la place. Désolé pour le hack.

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