DialogFragment
は、ダイアログの作成とホスティングのために設計された特殊なフラグメント サブクラスです。フラグメント内でダイアログをホストする必要はありませんが、そうすることで、FragmentManager
でダイアログの状態を管理し、構成の変更が発生したときにダイアログを自動的に復元できます。
DialogFragment の作成
DialogFragment
を作成するには、次の例に示すように、DialogFragment
を拡張して onCreateDialog()
をオーバーライドするクラスを作成します。
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"; }
onCreateView()
が通常のフラグメント内にルート View
を作成するのと同様に、onCreateDialog()
は DialogFragment
の一部として表示する Dialog
を作成します。DialogFragment
は、フラグメントのライフサイクル内で Dialog
を適切な状態で表示するよう処理します。
onCreateView()
と同様に、Dialog
の任意のサブクラスを onCreateDialog()
から返すことができますが、AlertDialog
の使用に限定されません。
DialogFragment を表示する
DialogFragment
を表示するために FragmentTransaction
を手動で作成する必要はありません。代わりに、show()
メソッドを使用してダイアログを表示します。FragmentManager
と String
への参照を渡して、FragmentTransaction
タグとして使用できます。
Fragment
内から DialogFragment
を作成する場合は、構成の変更後に状態が適切に復元されるように、フラグメントの子 FragmentManager
を使用します。null 以外のタグを使用すると、後で findFragmentByTag()
を使用して 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);
FragmentTransaction
の管理を強化するには、既存の FragmentTransaction
を受け入れる show()
オーバーロードを使用します。
DialogFragment ライフサイクル
DialogFragment
は標準のフラグメント ライフサイクルに従いますが、いくつかのライフサイクル コールバックが追加されています。一般的なライフサイクル コールバックは次のとおりです。
onCreateDialog()
: このコールバックをオーバーライドして、フラグメントが管理、表示するためのDialog
を提供します。onDismiss()
:Dialog
が閉じられたときに、リソースの解放やオブザーバブルなリソースの登録解除など、カスタム ロジックを実行する必要がある場合は、このコールバックをオーバーライドします。onCancel()
:Dialog
がキャンセルされたときにカスタム ロジックを実行する必要がある場合は、このコールバックをオーバーライドします。
DialogFragment
には、DialogFragment
のキャンセル可能性を設定または解除するメソッドも含まれています。
dismiss()
: フラグメントとそのダイアログを閉じます。フラグメントがバックスタックに追加された場合、このエントリまでのすべてのバックスタック状態がポップされます。それ以外の場合、フラグメントを削除するための新しいトランザクションが commit されます。setCancelable()
: 表示されたDialog
がキャンセル可能かどうかを制御します。Dialog.setCancelable(boolean)
を直接呼び出す代わりに、このメソッドを使用します。
Dialog
で DialogFragment
を使用する場合、onCreateView()
または onViewCreated()
をオーバーライドしません。ダイアログはビューだけでなく、独自のウィンドウもあります。そのため、onCreateView()
をオーバーライドするだけでは不十分です。また、onCreateView()
をオーバーライドして非 null のビューを指定しない限り、カスタム DialogFragment
で onViewCreated()
が呼び出されることはありません。
カスタムビューを使用する
DialogFragment
を作成し、onCreateView()
をオーバーライドすることでダイアログを表示できます。通常のフラグメントと同様に layoutId
を指定するか、DialogFragment
コンストラクタを使用します。
onCreateView()
から返される View
は、自動的にダイアログに追加されます。つまり、ほとんどの場合、デフォルトの空のダイアログにビューが入力されるため、onCreateDialog()
をオーバーライドする必要はありません。
DialogFragment
の特定のサブクラス(BottomSheetDialogFragment
など)は、ボトムシートとしてスタイル設定されたビューをダイアログに埋め込みます。