Mostra finestre di dialogo con DialogFragment

DialogFragment è una sottoclasse di frammento speciale progettata per la creazione e l'hosting di finestre di dialogo. Anche se non è necessario ospitare la finestra di dialogo all'interno di un frammento, in questo modo l'FragmentManager può gestire lo stato della finestra di dialogo e ripristinarla automaticamente quando si verifica una modifica alla configurazione.

Crea un DialogFragment

Per creare un DialogFragment, crea una classe che si estende DialogFragment e esegui l'override di onCreateDialog(), come mostrato nell'esempio seguente.

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";
}

In modo simile a come onCreateView() crea un View radice in un frammento ordinario, onCreateDialog() crea un Dialog da visualizzare come parte di DialogFragment. Gli handle DialogFragment mostrano Dialog negli stati appropriati del ciclo di vita del frammento.

Come con onCreateView(), puoi restituire qualsiasi sottoclasse di Dialog da onCreateDialog() e non sei limitato all'utilizzo di AlertDialog.

Mostra DialogFragment

Non è necessario creare manualmente un FragmentTransaction per visualizzare DialogFragment. Utilizza invece il metodo show() per visualizzare la finestra di dialogo. Puoi passare un riferimento a FragmentManager e String da utilizzare come tag FragmentTransaction.

Quando crei un DialogFragment all'interno di un Fragment, utilizza il valore secondario FragmentManager del frammento in modo che lo stato venga ripristinato correttamente dopo le modifiche alla configurazione. Un tag non null ti consente di utilizzare findFragmentByTag() per recuperare DialogFragment in un secondo momento.

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);

Per un maggiore controllo su FragmentTransaction, puoi utilizzare l'overload di show() che accetta un FragmentTransaction esistente.

Ciclo di vita di DialogFragment

Un DialogFragment segue il ciclo di vita dei frammenti standard, con alcuni callback aggiuntivi del ciclo di vita. I più comuni sono i seguenti:

  • onCreateDialog(): esegui l'override di questo callback per fornire un Dialog al frammento da gestire e visualizzare.
  • onDismiss(): esegui l'override di questo callback se devi eseguire una logica personalizzata quando ignori Dialog, ad esempio rilasciando risorse o annullando l'iscrizione alle risorse osservabili.
  • onCancel(): esegui l'override di questo callback se devi eseguire una logica personalizzata quando il Dialog viene annullato.

DialogFragment contiene anche metodi per ignorare o impostare l'annullamento di DialogFragment:

  • dismiss(): ignora il frammento e la relativa finestra di dialogo. Se il frammento è stato aggiunto allo stack di backup, vengono visualizzati tutti gli stati di back stack fino a questa voce inclusa. In caso contrario, si impegna a rimuovere il frammento per una nuova transazione.
  • setCancelable(): controlla se il valore Dialog mostrato può essere annullato. Utilizza questo metodo anziché chiamare direttamente Dialog.setCancelable(boolean).

Non esegui l'override di onCreateView() o onViewCreated() quando utilizzi un DialogFragment con un Dialog. Le finestre di dialogo non sono solo visualizzazioni, ma hanno una propria finestra. Di conseguenza, non è sufficiente eseguire l'override di onCreateView(). Inoltre, onViewCreated() non viene mai chiamato su un elemento DialogFragment personalizzato, a meno che tu non abbia sostituito onCreateView() e fornito una visualizzazione con valore non null.

Utilizza visualizzazioni personalizzate

Puoi creare un DialogFragment e visualizzare una finestra di dialogo eseguendo l'override di onCreateView(). Puoi assegnargli un layoutId, come con un frammento tipico, oppure utilizzare il costruttore DialogFragment.

Il valore View restituito da onCreateView() viene aggiunto automaticamente alla finestra di dialogo. Nella maggior parte dei casi, questo significa che non è necessario sostituire onCreateDialog(), perché la finestra di dialogo vuota predefinita viene completata con la tua visualizzazione.

Alcune sottoclassi di DialogFragment, come BottomSheetDialogFragment, incorporano la tua visualizzazione in una finestra di dialogo che ha lo stile di un riquadro inferiore.