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

DialogFragment は、ダイアログの作成とホスティングのために設計された特殊なフラグメント サブクラスです。1 対 1 やグループの会話に フラグメント内でダイアログをホストする場合、 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() 通常のフラグメント onCreateDialog() 内にルート View を作成します。 表示する Dialog を作成します。 これは DialogFragment の一部です。DialogFragment は、フラグメントのライフサイクル内で Dialog を適切な状態で表示するよう処理します。

onCreateView() と同様に、Dialog の任意のサブクラスを返すことができます。 使用制限はなく、onCreateDialog()から AlertDialog

DialogFragment を表示する

手動で FragmentTransaction を作成する必要は、 DialogFragmentを表示します。代わりに、show() メソッドを使用してダイアログを表示します。FragmentManager への参照を渡すことができます。 そして StringFragmentTransaction タグとして使用します。

作成時 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)

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

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

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

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

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