Eine DialogFragment
ist eine spezielle abgeleitete Fragment-Klasse, die zum Erstellen und Hosten von Dialogfeldern dient. Auch wenn Sie das Dialogfeld nicht in einem Fragment hosten müssen, kann das FragmentManager
-Element den Status des Dialogfelds verwalten und es bei einer Konfigurationsänderung automatisch wiederherstellen.
DialogFragment erstellen
Zum Erstellen einer DialogFragment
müssen Sie eine Klasse erstellen, die DialogFragment
erweitert, und onCreateDialog()
überschreiben, wie im folgenden Beispiel gezeigt.
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"; }
Ähnlich wie bei der Erstellung eines Stamm-View
von onCreateView()
in einem gewöhnlichen Fragment wird mit onCreateDialog()
ein Dialog
-Element erstellt, das als Teil von DialogFragment
angezeigt werden soll. Über DialogFragment
wird Dialog
an den entsprechenden Status im Lebenszyklus des Fragments angezeigt.
Wie bei onCreateView()
können Sie jede abgeleitete Klasse von Dialog
aus onCreateDialog()
zurückgeben. Sie sind nicht auf die Verwendung von AlertDialog
beschränkt.
DialogFragment anzeigen
Sie müssen FragmentTransaction
zum Anzeigen Ihres DialogFragment
nicht manuell erstellen. Verwenden Sie stattdessen die Methode show()
, um das Dialogfeld aufzurufen. Sie können einen Verweis an ein FragmentManager
- und ein String
-Objekt übergeben, um es als FragmentTransaction
-Tag zu verwenden.
Verwenden Sie beim Erstellen eines DialogFragment
innerhalb einer Fragment
die untergeordnete FragmentManager
des Fragments, damit der Status nach Konfigurationsänderungen ordnungsgemäß wiederhergestellt wird. Mit einem Nicht-Null-Tag können Sie findFragmentByTag()
verwenden, um DialogFragment
später abzurufen.
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);
Wenn Sie den FragmentTransaction
genauer steuern möchten, können Sie die show()
-Überlastung verwenden, die eine vorhandene FragmentTransaction
akzeptiert.
DialogFragment-Lebenszyklus
Ein DialogFragment
folgt dem Standardlebenszyklus eines Fragments mit einigen zusätzlichen Lebenszyklus-Callbacks. Die häufigsten sind:
onCreateDialog()
: Überschreiben Sie diesen Callback, um einDialog
für das zu verwaltende und anzuzeigende Fragment bereitzustellen.onDismiss()
: Überschreibe diesen Callback, wenn du eine benutzerdefinierte Logik ausführen musst, wennDialog
geschlossen wird, z. B. Ressourcen freigeben oder beobachtbare Ressourcen abbestellen.onCancel()
: Überschreibe diesen Callback, wenn du eine benutzerdefinierte Logik ausführen musst, wennDialog
abgebrochen wird.
DialogFragment
enthält auch Methoden zum Schließen oder Festlegen der Kündigungsfähigkeit Ihres DialogFragment
:
dismiss()
: Das Fragment und das zugehörige Dialogfeld werden geschlossen. Wenn das Fragment dem Back-Stack hinzugefügt wurde, werden alle Back-Stack-Zustände bis einschließlich diesem Eintrag per Pop-up hinzugefügt. Andernfalls wird eine neue Transaktion durchgeführt, um das Fragment zu entfernen.setCancelable()
: Damit wird festgelegt, ob die angezeigteDialog
abgebrochen werden kann. Verwenden Sie diese Methode, anstattDialog.setCancelable(boolean)
direkt aufzurufen.
Sie überschreiben onCreateView()
oder onViewCreated()
nicht, wenn Sie DialogFragment
mit einem Dialog
verwenden. Dialoge sind nicht nur Ansichten,
sie haben ein eigenes Fenster. Daher reicht es nicht aus, onCreateView()
zu überschreiben. Außerdem wird onViewCreated()
nie für einen benutzerdefinierten DialogFragment
aufgerufen, es sei denn, Sie haben onCreateView()
überschrieben und eine Nicht-Null-Ansicht bereitgestellt.
Benutzerdefinierte Ansichten verwenden
Sie können ein DialogFragment
erstellen und ein Dialogfeld anzeigen, indem Sie onCreateView()
überschreiben.
Sie können dafür entweder wie bei einem typischen Fragment einen layoutId
angeben oder den Konstruktor DialogFragment
verwenden.
Das von onCreateView()
zurückgegebene View
wird automatisch dem Dialogfeld hinzugefügt. In den meisten Fällen bedeutet dies, dass Sie onCreateDialog()
nicht überschreiben müssen, da das standardmäßig leere Dialogfeld mit Ihrer Ansicht gefüllt wird.
Bestimmte Unterklassen von DialogFragment
wie BottomSheetDialogFragment
betten Ihre Ansicht in ein Dialogfeld ein, das als Ansicht am unteren Rand gestaltet ist.