Plus simple fragment de dialog oui / non

Je voudrais faire un dialog fragment qui demande “Êtes-vous sûr?” avec une réponse “oui / non”.

J’ai regardé la documentation et elle est très détaillée, expliquant comment créer des boîtes de dialog avancées, mais pas de code intact pour créer une boîte de dialog simple «bonjour monde». La plupart des didacticiels utilisent le système de boîte de dialog obsolète. Le blog officiel semble être inutilement compliqué et difficile à comprendre.

Alors, quel est le moyen le plus simple de créer et d’afficher un dialog d’alerte vraiment basique? Points bonus s’il utilise la bibliothèque de support.

Un DialogFragment n’est en réalité qu’un fragment qui enveloppe une boîte de dialog. Vous pouvez y placer n’importe quel type de dialog en créant et en renvoyant la boîte de dialog dans la méthode onCreateDialog () du DialogFragment.

Voici un exemple de dialog:

 class MyDialogFragment extends DialogFragment{ Context mContext; public MyDialogFragment() { mContext = getActivity(); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(mContext); alertDialogBuilder.setTitle("Really?"); alertDialogBuilder.setMessage("Are you sure?"); //null should be your on click listener alertDialogBuilder.setPositiveButton("OK", null); alertDialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); return alertDialogBuilder.create(); } } 

Pour créer l’appel de dialog:

 new MyDialogFragment().show(getFragmentManager(), "MyDialog"); 

Et pour écarter le dialog de quelque part:

 ((MyDialogFragment)getFragmentManager().findFragmentByTag("MyDialog")).getDialog().dismiss(); 

Tout ce code fonctionnera parfaitement avec la bibliothèque de support, simplement en modifiant les importations pour utiliser les classes de bibliothèque de support.

Alors, quel est le moyen le plus simple de créer et d’afficher un dialog d’alerte vraiment basique? Points bonus s’il utilise la bibliothèque de support.

Créez simplement un DialogFragment (sdk ou bibliothèque de support) et remplacez sa méthode onCreateDialog pour retourner un AlertDialog avec le texte et les boutons souhaités:

 public static class SimpleDialog extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(getActivity()) .setMessage("Are you sure?").setPositiveButton("Ok", null) .setNegativeButton("No way", null).create(); } } 

Pour faire quelque chose lorsque l’utilisateur utilise l’un des boutons, vous devrez fournir une instance de DialogInterface.OnClickListener au lieu des références null de mon code.

Pour ceux qui codent avec Kotlin et Anko , vous pouvez maintenant faire des dialogs en 4 lignes de code:

 alert("Order", "Do you want to order this item?") { positiveButton("Yes") { processAnOrder() } negativeButton("No") { } }.show() 

En raison du cycle de vie Activity / Fragment, l’ approche @athor & @lugsprog peut échouer, mais la méthode la plus élégante consiste à récupérer le contexte d’activité de la méthode onAttach et à le stocker comme référence faible ** (et à éviter le constructeur par défaut argument pour dialogr utiliser des arguments) comme ceci:

 public class NotReadyDialogFragment extends DialogFragment { public static Ssortingng DIALOG_ARGUMENTS = "not_ready_dialog_fragment_arguments"; private WeakReference _contextRef; public NotReadyDialogFragment() { } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { /** example pulling of arguments */ Bundle bundle = getArguments(); if (bundle!=null) { bundle.get(DIALOG_ARGUMENTS); } // // Caution !!! // check we can use contex - by call to isAttached // or by checking stored weak reference value itself is not null // or stored in context -> example allowCreateDialog() // - then for example you could throw illegal state exception or return null // AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(_contextRef.get()); alertDialogBuilder.setMessage("..."); alertDialogBuilder.setNegativeButton("Przerwij", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); return alertDialogBuilder.create(); } @Override public void onAttach(Activity activity) { super.onAttach(activity); _contextRef = new WeakReference(activity); } boolean allowCreateDialog() { return _contextRef !== null && _contextRef.get() != null; } 

EDIT: & si vous voulez écarter le dialog alors:

  1. essayer de l’obtenir
  2. vérifier s’il existe
  3. vérifier si elle montre
  4. rejeter

quelque chose comme ça :

  NotReadyDialogFragment dialog = ((NotReadyDialogFragment) getActivity().getFragmentManager().findFragmentByTag("MyDialogTag")); if (dialog != null) { Dialog df = dialog.getDialog(); if (df != null && df.isShowing()) { df.dismiss(); } } 

EDIT2: & si vous voulez définir un dialog comme non annulable, vous devriez changer l’instruction de retour onCreatweDialog comme ceci:

  /** convert builder to dialog */ AlertDialog alert = alertDialogBuilder.create(); /** disable cancel outside touch */ alert.setCanceledOnTouchOutside(false); /** disable cancel on press back button */ setCancelable(false); return alert;