DialogFragment
est une sous-classe de fragment spéciale conçue pour créer et héberger des boîtes de dialogue. À proprement parler, vous n'avez pas besoin d'héberger votre boîte de dialogue dans un fragment. En revanche, cela permet à FragmentManager
de gérer l'état de la boîte de dialogue et de la restaurer automatiquement en cas de modification de la configuration.
Créer un DialogFragment
Pour créer un DialogFragment
, créez d'abord une classe qui étend DialogFragment
et supprimez onCreateDialog()
, comme illustré dans l'exemple suivant.
Kotlin
class PurchaseConfirmationDialogFragment : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = AlertDialog.Builder(requireContext()) .setMessage(getString(R.string.order_confirmation)) .setPositiveButton(getString(R.string.ok)) { _,_ -> } .create() companion object { const val TAG = "PurchaseConfirmationDialog" } }
Java
public class PurchaseConfirmationDialogFragment extends DialogFragment { @NonNull @Override public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { return new AlertDialog.Builder(requireContext()) .setMessage(getString(R.string.order_confirmation)) .setPositiveButton(getString(R.string.ok), (dialog, which) -> {} ) .create(); } public static String TAG = "PurchaseConfirmationDialog"; }
De la même manière que onCreateView()
doit créer une racine View
dans un fragment ordinaire, onCreateDialog()
doit créer une Dialog
à afficher dans le cadre de DialogFragment
. DialogFragment
gère l'affichage de la Dialog
aux états appropriés dans le cycle de vie du fragment.
Comme pour onCreateView()
, vous pouvez renvoyer n'importe quelle sous-classe de Dialog
à partir de onCreateDialog()
. Vous n'êtes pas limité à l'utilisation de AlertDialog
.
Affichage du DialogFragment
Il n'est pas nécessaire de créer manuellement une FragmentTransaction
pour afficher votre DialogFragment
. Utilisez plutôt la méthode show()
pour afficher votre boîte de dialogue. Vous pouvez transmettre une référence à FragmentManager
et à String
pour l'utiliser comme une balise de FragmentTransaction
. Lorsque vous créez un DialogFragment
à partir d'un Fragment
, vous devez utiliser le FragmentManager
du Fragment
enfant pour vous assurer que l'état est correctement restauré une fois la configuration modifiée. Une balise non nulle vous permet d'utiliser findFragmentByTag()
pour récupérer le DialogFragment
ultérieurement.
Kotlin
// From another Fragment or Activity where you wish to show this // PurchaseConfirmationDialogFragment. PurchaseConfirmationDialogFragment().show( childFragmentManager, PurchaseConfirmationDialog.TAG)
Java
// From another Fragment or Activity where you wish to show this // PurchaseConfirmationDialogFragment. new PurchaseConfirmationDialogFragment().show( getChildFragmentManager(), PurchaseConfirmationDialog.TAG);
Pour avoir plus de contrôle sur la FragmentTransaction
, vous pouvez utiliser la surcharge show()
qui accepte un objet FragmentTransaction
existant.
Cycle de vie DialogFragment
Un DialogFragment
suit le cycle de vie du fragment standard. En outre, DialogFragment
comporte quelques rappels de cycle de vie supplémentaires. Les plus courants sont les suivants :
onCreateDialog()
- Supprimez ce rappel afin de fournir uneDialog
que le fragment doit gérer et afficher.onDismiss()
- Supprimez ce rappel si vous devez effectuer une logique personnalisée lorsque votreDialog
est ignorée, par exemple pour libérer des ressources ou vous désabonner des ressources observables, etc.onCancel()
- Supprimez ce rappel si vous devez exécuter une logique personnalisée lorsque votreDialog
est annulée.
DialogFragment
contient également des méthodes permettant d'ignorer ou de définir la possibilité d'annulation de votre DialogFragment
:
dismiss()
- Permet d'ignorer le fragment et sa boîte de dialogue. Si le fragment a été ajouté à la pile "Retour", tous les états de la pile "Retour" jusqu'à cette entrée (incluse) sont supprimés. Sinon, une nouvelle transaction est validée pour supprimer le fragment.setCancellable()
- Contrôle si laDialog
affichée peut être annulée. Il est préférable d'utiliser cette méthode plutôt que d'appeler directementDialog.setCancelable(boolean)
.
Notez que vous ne supprimez pas onCreateView()
ni onViewCreated()
lorsque vous utilisez DialogFragment
avec une Dialog
. Les boîtes de dialogue ne sont pas que des affichages : elles ont leur propre fenêtre. Par conséquent, il ne suffit pas de supprimer onCreateView()
. De plus, onViewCreated()
n'est jamais appelé sur un DialogFragment
personnalisé, sauf si vous avez remplacé onCreateView()
et fourni un affichage non-nul.
Utiliser des affichages personnalisés
Vous pouvez créer un DialogFragment
et afficher une boîte de dialogue en supprimant onCreateView()
. Pour ce faire, attribuez-lui un layoutId
comme vous le feriez avec un fragment classique ou utilisez la méthode Constructeur de DialogFragment
.
Le View
renvoyé par onCreateView() est alors automatiquement ajouté à la boîte de dialogue. Dans la plupart des cas, cela signifie que vous n'avez pas besoin de supprimer onCreateDialog()
, car l'affichage est ajouté à la boîte de dialogue qui est vide par défaut.
Certaines sous-classes de DialogFragment
, telles que BottomSheetDialogFragment
, intègrent votre affichage dans une boîte de dialogue stylisée sous la forme d'une bottom sheet.