A DialogFragment
is a
special fragment subclass that is designed for creating and hosting
dialogs. Although you don't need to
host your dialog within a fragment, doing so lets the
FragmentManager
manage the state
of the dialog and automatically restore the dialog when a configuration
change occurs.
Create a DialogFragment
To create a DialogFragment
, create a class that extends
DialogFragment
and
override
onCreateDialog()
,
as shown in the following example.
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"; }
Similar to how
onCreateView()
creates a root View
in an ordinary fragment, onCreateDialog()
creates a Dialog
to display
as part of the DialogFragment
. The DialogFragment
handles displaying
the Dialog
at appropriate states in the fragment's lifecycle.
As with onCreateView()
, you can return any subclass of Dialog
from onCreateDialog()
and aren't limited to using
AlertDialog
.
Show the DialogFragment
You don't have to manually create a FragmentTransaction
to
display your DialogFragment
. Instead, use the show()
method to
display your dialog. You can pass a reference to a FragmentManager
and a String
to use as a FragmentTransaction
tag.
When creating
a DialogFragment
from within a Fragment
, use the fragment's
child FragmentManager
so that the state properly restores
after configuration changes. A non-null tag lets you use
findFragmentByTag()
to retrieve the DialogFragment
at a later time.
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);
For more control over the
FragmentTransaction
,
you can use the
show()
overload that accepts an existing FragmentTransaction
.
DialogFragment lifecycle
A DialogFragment
follows the standard fragment lifecycle,
with a few additional lifecycle callbacks. The most
common ones are as follows:
onCreateDialog()
: override this callback to provide aDialog
for the fragment to manage and display.onDismiss()
: override this callback if you need to perform any custom logic when yourDialog
is dismissed, such as releasing resources or unsubscribing from observable resources.onCancel()
: override this callback if you need to perform any custom logic when yourDialog
is canceled.
DialogFragment
also contains methods to dismiss or set the cancelability
of your DialogFragment
:
dismiss()
: dismiss the fragment and its dialog. If the fragment was added to the back stack, all back stack state up to and including this entry are popped. Otherwise, a new transaction is committed to remove the fragment.setCancelable()
: control whether the shownDialog
is cancelable. Use this method instead of directly callingDialog.setCancelable(boolean)
.
You don't override
onCreateView()
or
onViewCreated()
when using a DialogFragment
with a Dialog
. Dialogs aren't only
views—they have their own window. As such, it's not enough to override
onCreateView()
. Moreover, onViewCreated()
is never called on a
custom DialogFragment
unless you've overridden onCreateView()
and
provided a non-null view.
Use custom views
You can create a DialogFragment
and display a dialog by overriding
onCreateView()
.
You can either give it a layoutId
, as with a typical fragment, or use the
DialogFragment
constructor.
The View
returned by onCreateView()
is automatically added to the dialog. In most cases, this means that you
don't need to override
onCreateDialog()
,
as the default empty dialog is populated with your view.
Certain subclasses of DialogFragment
, such as
BottomSheetDialogFragment
,
embed your view in a dialog that is styled as a bottom sheet.