Wyświetl okna z oknami DialogFragment

DialogFragment to specjalna podklasa fragmentów przeznaczona do tworzenia i hostowania okna dialogowego. Chociaż nie musisz hostować okna dialogowego w obrębie fragmentu, umożliwia to FragmentManager zarządzanie stanem okna i automatyczne przywracanie go po zmianie konfiguracji.

Utwórz DialogFragment

Aby utworzyć klasę DialogFragment, utwórz klasę, która rozszerza zakres DialogFragment i zastąp onCreateDialog(), jak pokazano w poniższym przykładzie.

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";
}

Podobnie jak onCreateView() tworzy poziom główny View we fragmencie zwykłym, onCreateDialog() tworzy element Dialog, który będzie wyświetlany jako część DialogFragment. Interfejs DialogFragment wyświetla Dialog w odpowiednich stanach cyklu życia fragmentu.

Podobnie jak w przypadku onCreateView(), możesz zwrócić dowolną podklasę Dialog z onCreateDialog() i nie jest ograniczony do użycia AlertDialog.

Pokaż DialogFragment

Aby wyświetlić DialogFragment, nie musisz ręcznie tworzyć elementów FragmentTransaction. Zamiast tego do wyświetlania okna używaj metody show(). Możesz przekazywać odniesienie do FragmentManager i String, aby używać ich jako tagu FragmentTransaction.

Podczas tworzenia obiektu DialogFragment z poziomu Fragment użyj jego podrzędnego FragmentManager fragmentu, aby stan był poprawnie przywracany po zmianie konfiguracji. Tag, który nie ma wartości null, umożliwia użycie findFragmentByTag() do późniejszego pobrania parametru DialogFragment.

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);

Aby uzyskać większą kontrolę nad elementem FragmentTransaction, możesz użyć przeciążenia show(), które akceptuje istniejący obiekt FragmentTransaction.

Cykl życia DialogFragment

Element DialogFragment postępuje zgodnie ze standardowym cyklem życia fragmentu z kilkoma dodatkowymi wywołaniami zwrotnymi. Oto najczęstsze z nich:

  • onCreateDialog(): zastąp to wywołanie zwrotne, by zapewnić parametr Dialog dla fragmentu, który umożliwia zarządzanie nim i jego wyświetlanie.
  • onDismiss(): zastąp to wywołanie zwrotne, jeśli po zamknięciu elementu Dialog musisz wykonać niestandardową logikę, np. zwolnić zasoby lub anulować subskrypcję zasobów dostępnych do obserwacji.
  • onCancel(): zastąp to wywołanie zwrotne, jeśli chcesz wykonać niestandardową logikę po anulowaniu wywołania Dialog.

DialogFragment zawiera też metody pozwalające odrzucić lub ustawić możliwość anulowania obiektu DialogFragment:

  • dismiss(): zamknij fragment i jego okno. Jeśli fragment został dodany do stosu wstecznego, wprowadzane są wszystkie informacje o stanie stosu wstecznego do tego wpisu włącznie. W przeciwnym razie zostanie zatwierdzona nowa transakcja, która spowoduje usunięcie danego fragmentu.
  • setCancelable(): określa, czy można anulować wyświetlaną wartość Dialog. Użyj tej metody, zamiast wywoływać bezpośrednio metodę Dialog.setCancelable(boolean).

Nie zastępujesz wartości onCreateView() ani onViewCreated(), gdy używasz DialogFragment z Dialog. Okna to nie tylko widoki – mają swoje własne okno. W związku z tym nie wystarczy zastąpić uprawnienia onCreateView(). Dodatkowo funkcja onViewCreated() nigdy nie jest wywoływana w niestandardowym elemencie DialogFragment, chyba że zastąpisz onCreateView() i udostępnisz widok niepusty.

Używanie widoków niestandardowych

Zastąpienie onCreateView() pozwala utworzyć pole DialogFragment i wyświetlić okno. Możesz mu nadać layoutId, tak jak w przypadku typowego fragmentu, lub użyć konstruktora DialogFragment.

Wartość View zwrócona przez onCreateView() zostanie automatycznie dodana do okna. W większości przypadków oznacza to, że nie musisz zastępować danych onCreateDialog(), ponieważ domyślne puste okno jest wypełniane Twoim widokiem.

Niektóre podklasy DialogFragment, takie jak BottomSheetDialogFragment, umieszczają widok w oknie, które ma styl arkusza dolnego.