読者です 読者をやめる 読者になる 読者になる

It’s now or never

IT系の技術ブログです。気になったこと、勉強したことを備忘録的にまとめて行きます。

【Android】DialogFragmentを使ってみる

Android 3.0以降、ダイアログの表示には、DialogFragmentを使用することが推奨されているようです。
基本的な表示処理は、Fragmentと変わらないみたいなのですが、 使用したことがなかったので試してみました。

DialogFragmentの表示

ダイアログを表示するには、DialogFragmentを継承したクラスを作成して、
各メソッドを継承します。

最低限ダイアログの表示を確認するのであれば、onCreateDialog()を継承し、
表示したいDIalogクラスのインスタンスを返却してあげればOKです。

public class MyDialogFragment extends DialogFragment {
    
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder alert = new AlertDialog.Builder(getActivity())
            .setTitle("タイトル")
            .setMessage("メッセージ")
            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dismiss();
                }
            });
        return alert.create();
    }    
}

ただし、Fragmentを継承したDialogFragmentは、
Fragmentと同様に再生成時にデフォルトコンストラクタが呼ばれる使用のため、
初期化時は、以下のようにsetArguments()を使用するのがお作法です。

public static final MyDialogFragment newInstance(int flags) {

    Bundle args = new Bundle();
    args.putInt("flags", flags);

    MyDialogFragment fragment = new MyDialogFragment();
    fragment.setArguments(args);
    return fragment;
}

ハマったところ

DialogFragmetの表示処理(初期化を含む)をActivityのOnCreate()に記載していたのですが、
回転処理で異常終了が発生する不具合がありました。

DialogFragmetの実装クラスがインナークラスとして宣言されている場合、
Publicな標準コンストラクタが呼び出せず例外が発生するようです。
そのためDialogFragmetは、Publicなクラスとして使用するのが一般的なようです。