DialogFragment を使用してダイアログを表示する

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() メソッドを使用してダイアログを表示します。FragmentManagerString への参照を渡して、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) を直接呼び出す代わりに、このメソッドを使用します。

DialogDialogFragment を使用する場合、onCreateView() または onViewCreated() をオーバーライドしません。ダイアログはビューだけでなく、独自のウィンドウもあります。そのため、onCreateView() をオーバーライドするだけでは不十分です。また、onCreateView() をオーバーライドして非 null のビューを指定しない限り、カスタム DialogFragmentonViewCreated() が呼び出されることはありません。

カスタムビューを使用する

DialogFragment を作成し、onCreateView() をオーバーライドすることでダイアログを表示できます。通常のフラグメントと同様に layoutId を指定するか、DialogFragment コンストラクタを使用します。

onCreateView() から返される View は、自動的にダイアログに追加されます。つまり、ほとんどの場合、デフォルトの空のダイアログにビューが入力されるため、onCreateDialog() をオーバーライドする必要はありません。

DialogFragment の特定のサブクラス(BottomSheetDialogFragment など)は、ボトムシートとしてスタイル設定されたビューをダイアログに埋め込みます。