Dialogfelder mit DialogFragment anzeigen

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 ein Dialog für das zu verwaltende und anzuzeigende Fragment bereitzustellen.
  • onDismiss(): Überschreibe diesen Callback, wenn du eine benutzerdefinierte Logik ausführen musst, wenn Dialog geschlossen wird, z. B. Ressourcen freigeben oder beobachtbare Ressourcen abbestellen.
  • onCancel(): Überschreibe diesen Callback, wenn du eine benutzerdefinierte Logik ausführen musst, wenn Dialog 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 angezeigte Dialog abgebrochen werden kann. Verwenden Sie diese Methode, anstatt Dialog.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.