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 unDialog
al frammento da gestire e visualizzare.onDismiss()
: esegui l'override di questo callback se devi eseguire una logica personalizzata quando ignoriDialog
, 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 ilDialog
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 valoreDialog
mostrato può essere annullato. Utilizza questo metodo anziché chiamare direttamenteDialog.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.