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 unDialog
per il frammento a gestire e visualizzare.onDismiss()
: esegui l'override di questo callback se devi eseguire una logica personalizzata quandoDialog
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 quandoDialog
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'elementoDialog
mostrato è annullabile. Utilizza questo metodo anziché chiamare direttamenteDialog.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.