Mostra finestre di dialogo con DialogFragment

Un DialogFragment è un una sottoclasse speciale di frammento progettata per la creazione e l'hosting finestre di dialogo. Anche se non è necessario ospitare la finestra di dialogo all'interno di un frammento, in questo modo FragmentManager gestisci lo stato della finestra di dialogo e ripristinarla automaticamente quando viene un cambiamento.

Crea un DialogFragment

Per creare un DialogFragment, crea un corso che si estenda DialogFragment e eseguire l'override 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";
}

Simile a come onCreateView() crea una radice View in un frammento ordinario, onCreateDialog() crea una Dialog per visualizzare nell'ambito di DialogFragment. Gli handle DialogFragment che visualizzano Dialog negli stati appropriati nel ciclo di vita del frammento.

.

Come per onCreateView(), puoi restituire qualsiasi sottoclasse di Dialog da onCreateDialog() e non si limitano all'utilizzo AlertDialog.

Mostra DialogFragment

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

Durante la creazione un DialogFragment da un Fragment, utilizza il metodo secondario FragmentManager in modo che lo stato venga ripristinato correttamente dopo le modifiche alla configurazione. Un tag non null 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 FragmentTransaction, puoi utilizzare show() sovraccarico che accetta un FragmentTransaction esistente.

Ciclo di vita di DialogFragment

DialogFragment segue il ciclo di vita standard dei frammenti con alcuni callback aggiuntivi del ciclo di vita. Il più quelli più comuni sono:

  • onCreateDialog(): sostituisci questo callback per fornire un Dialog per il frammento a gestire e visualizzare.
  • onDismiss(): esegui l'override di questo callback se devi eseguire una logica personalizzata quando Dialog viene ignorato, ad esempio il rilascio di risorse o l'annullamento della sottoscrizione da risorse osservabili.
  • onCancel(): esegui l'override di questo callback se devi eseguire una logica personalizzata quando Dialog 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 dello stack, tutti gli stati dello stack fino a questa voce inclusa vengono estratti tramite pop up. In caso contrario, viene eseguito il commit di una nuova transazione per rimuovere il frammento.
  • setCancelable(): controlla se l'elemento Dialog mostrato è annullabile. Utilizza questo metodo anziché chiamare direttamente Dialog.setCancelable(boolean)

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

.

Utilizzare le visualizzazioni personalizzate

Puoi creare un DialogFragment e visualizzare una finestra di dialogo eseguendo l'override onCreateView() Puoi assegnare un valore layoutId, come nel caso di un frammento tipico, oppure utilizzare il metodo costruttore DialogFragment.

View restituito da onCreateView() viene aggiunto automaticamente alla finestra di dialogo. Nella maggior parte dei casi, ciò significa non hanno bisogno di eseguire l'override onCreateDialog(), poiché la finestra di dialogo vuota predefinita viene compilata con la tua visualizzazione.

Alcune sottoclassi di DialogFragment, ad esempio BottomSheetDialogFragment, Incorporare la visualizzazione in una finestra di dialogo con lo stile di riquadro inferiore.