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ć parametrDialog
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 elementuDialog
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łaniaDialog
.
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.