Dialogfelder mit DialogFragment anzeigen

Ein DialogFragment ist ein Fragment-Unterklasse, die zum Erstellen und Hosten Dialogfelder. Auch wenn Sie sich Ihr Dialogfeld in einem Fragment hosten, FragmentManager verwaltet den Status des Dialogfelds und stellen es automatisch wieder her, wenn eine Konfiguration erfolgt.

DialogFragment erstellen

Zum Erstellen einer DialogFragment erstellen Sie eine Klasse, die DialogFragment und überschreiben onCreateDialog(), 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 onCreateView() erstellt einen Stamm View in einem gewöhnlichen Fragment, onCreateDialog() erstellt eine Dialog zum Anzeigen im Rahmen der DialogFragment. Der DialogFragment steuert die Anzeige das Dialog in den entsprechenden Zuständen im Lebenszyklus des Fragments.

Wie bei onCreateView() können Sie jede abgeleitete Klasse von Dialog zurückgeben. onCreateDialog() und sind nicht auf die Verwendung von AlertDialog

DialogFragment anzeigen

Sie müssen FragmentTransaction nicht manuell erstellen, DialogFragment anzeigen lassen. Verwenden Sie stattdessen die Methode show(), Dialogfeld anzeigen. Du kannst eine Referenz an FragmentManager übergeben. und ein String zur Verwendung als FragmentTransaction-Tag.

Beim Erstellen ein DialogFragment innerhalb einer Fragment, verwenden Sie den Wert des Fragments, Untergeordnetes FragmentManager, damit der Status ordnungsgemäß wiederhergestellt wird nach Konfigurationsänderungen. Mit einem Tag ungleich Null können Sie findFragmentByTag(), um den DialogFragment zu einem späteren Zeitpunkt 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);

Für mehr Kontrolle über die FragmentTransaction, können Sie den show() Überlastung, die ein vorhandenes FragmentTransaction-Objekt akzeptiert.

DialogFragment-Lebenszyklus

Ein DialogFragment entspricht dem Standard-Fragmentlebenszyklus, mit einigen zusätzlichen Lebenszyklus-Callbacks. Die meisten sind folgende:

  • onCreateDialog(): diesen Callback überschreiben, um einen Dialog für das Fragment bereitzustellen, verwalten und anzeigen lassen.
  • onDismiss(): überschreiben Sie diesen Callback, wenn Sie beim Ausführen einer benutzerdefinierten Logik Deine Dialog wurde geschlossen, z. B. indem du Ressourcen freigibst oder dich abmeldest aus beobachtbaren Ressourcen.
  • onCancel(): überschreiben Sie diesen Callback, wenn Sie beim Ausführen einer benutzerdefinierten Dialog wurde abgesagt.

DialogFragment enthält auch Methoden zum Schließen oder Festlegen der Annullierung Ihrer DialogFragment:

  • dismiss(): das Fragment und sein Dialogfeld schließen. Wurde das Fragment Back-Stack-Status und alle Back-Stack-Status bis einschließlich zu diesem Eintrag werden per Pop-up entfernt. Andernfalls wird eine neue Transaktion durchgeführt, um das Fragment zu entfernen.
  • setCancelable(): Steuerelement, ob die angezeigte Dialog stornierbar ist. Diese Methode verwenden anstatt sie direkt anzurufen, Dialog.setCancelable(boolean)

Nicht überschreiben onCreateView() oder onViewCreated() wenn Sie DialogFragment mit einem Dialog verwenden. Aber Dialoge sind nicht nur – sie haben ein eigenes Fenster. Daher reicht es nicht aus, die onCreateView() Außerdem wird onViewCreated() niemals benutzerdefinierten DialogFragment, es sei denn, Sie haben onCreateView() und hat eine Ansicht ungleich Null bereitgestellt.

Benutzerdefinierte Ansichten verwenden

Sie können ein DialogFragment erstellen und ein Dialogfeld anzeigen, indem Sie onCreateView() Sie können ihr entweder wie bei einem typischen Fragment layoutId zuweisen oder die Methode DialogFragment-Konstruktor.

Die von onCreateView() zurückgegebene View wird dem Dialogfeld automatisch hinzugefügt. In den meisten Fällen bedeutet dies, müssen keine Überschreibungen onCreateDialog(), da das leere Dialogfeld standardmäßig mit Ihrer Ansicht gefüllt wird.

Bestimmte abgeleitete Klassen von DialogFragment, z. B. BottomSheetDialogFragment, Betten Sie Ihre Ansicht in ein Dialogfeld ein, das als Ansicht am unteren Rand gestaltet ist.