Wyświetl okna z oknami DialogFragment

DialogFragment to specjalna podklasa fragmentów przeznaczona do tworzenia i hostowania okna dialogowe. Chociaż nie trzeba hostuj okno dialogowe we fragmencie, dzięki czemu FragmentManager – zarządzanie stanem i automatycznie przywróć to okno, gdy konfiguracja gdy następuje zmiana.

Utwórz fragment DialogFragment

Aby utworzyć klasę DialogFragment, utwórz zajęcia, które rozszerzają się DialogFragment i zastąpić onCreateDialog(), jak 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";
}

Podobne do tego, jak to zrobić onCreateView() tworzy pierwiastek View we fragmencie zwykłym, onCreateDialog() tworzy Dialog do wyświetlenia w ramach DialogFragment. Uchwyty DialogFragment do wyświetlania Dialog w odpowiednich stanach cyklu życia fragmentu.

Tak jak w przypadku onCreateView(), możesz zwrócić dowolną podklasę klasy Dialog od onCreateDialog() i nie są ograniczone do używania AlertDialog

Pokaż fragment DialogFragment

Nie musisz ręcznie tworzyć FragmentTransaction, aby wyświetli DialogFragment. Zamiast tego użyj metody show() do wyświetlić okno. Możesz przekazać odwołanie do FragmentManager i String, które będą używane jako tag FragmentTransaction.

Podczas tworzenia DialogFragment z zakresu Fragment, użyj parametru element podrzędny FragmentManager, aby stan został prawidłowo przywrócony po zmianie konfiguracji. Tag o wartości niepustej umożliwia korzystanie z findFragmentByTag(), aby pobrać DialogFragment później.

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

Większą kontrolę nad FragmentTransaction możesz użyć funkcji show() przeciążenie, które akceptuje istniejący element FragmentTransaction.

Cykl życia DialogFragment

DialogFragment podlega standardowym cyklowi życia fragmentów, z kilkoma dodatkowymi wywołaniami zwrotnymi w cyklu życia. Najbardziej są następujące:

  • onCreateDialog(): zastąp to wywołanie zwrotne, aby podać Dialog dla fragmentu do zarządzania i wyświetlania.
  • onDismiss(): zastąp to wywołanie zwrotne, jeśli chcesz wykonać niestandardową logikę podczas usługa Dialog została zamknięta, np. zwalnianie zasobów lub rezygnacja z subskrypcji z obserwowalnych zasobów.
  • onCancel(): zastąp to wywołanie zwrotne, jeśli chcesz wykonać niestandardową logikę podczas Wydarzenie Dialog zostało anulowane.

DialogFragment zawiera też metody odrzucania lub ustawiania możliwości anulowania z DialogFragment:

  • dismiss(): zamknij fragment i jego okno dialogowe. Jeśli fragment został dodany do sekcji wszystkie stany stosu wstecznego do tego wpisu włącznie z tym wpisem. W przeciwnym razie nowa transakcja ma na celu usunięcie fragmentu.
  • setCancelable(): określają, czy wyświetlenie Dialog ma możliwość anulowania. Użyj tej metody zamiast dzwonić bezpośrednio Dialog.setCancelable(boolean)

Nie zastępujesz onCreateView() lub onViewCreated() w przypadku używania DialogFragment z Dialog. Okna to nie tylko mają własne okno. W związku z tym nie wystarczy zastąpić onCreateView() Poza tym funkcja onViewCreated() nigdy nie jest wywoływana dla niestandardowy DialogFragment, chyba że zastąpisz onCreateView() i zapewnił widok o wartości niezerowej.

Korzystanie z widoków niestandardowych

Możesz utworzyć DialogFragment i wyświetlić okno, zastępując onCreateView() Możesz dać mu layoutId, jak w przypadku typowego fragmentu, lub użyć funkcji Konstruktor DialogFragment.

Kwota View zwrócona przez: onCreateView() zostanie automatycznie dodany do tego okna. W większości przypadków oznacza to, nie trzeba zastępować onCreateDialog() ponieważ domyślne puste okno zawiera Twój widok.

Niektóre podklasy klasy DialogFragment, takie jak BottomSheetDialogFragment, umieścić widok w oknie, które ma styl planszy dolnej.