DialogFragmentから呼び出し元に結果を伝える

ツイート このエントリーをはてなブックマークに追加
1つ上へ / ブログトップへ

テキストを入力したり、はい/いいえを選んでもらうためにダイアログを表示すると思います。今回はその結果を呼び出し元に伝える方法を紹介します。

まず、前回説明を省略したnewInstance()の部分から。

public static MyDialogFragment newInstance(Fragment target, int requestCode) {
    MyDialogFragment fragment = new MyDialogFragment();
    fragment.setTargetFragment(target, requestCode);

    Bundle args = new Bundle();
    fragment.setArguments(args);

    return fragment;
}

DialogFragment(呼び出された側)オブジェクトに、setTargetFragment()メソッドで呼び出し元Fragmentとリクエストコードをセットしています。ここでセットされた呼び出し元Fragmentオブジェクトは、Activity/Fragment再生成時に関係をちゃんと保持したままセットされるという優れものです。

ここでセットした呼び出し元Fragmentに入力結果を伝えてみます。

void submit() {
    Fragment target = getTargetFragment();
    if (target == null) {
        dismiss();
        return; 
    }
        
    Dialog dialog = getDialog();
    EditText editText = (EditText) dialog.findViewById(R.id.edit);
        
    Intent data = new Intent();
    data.putExtra(Intent.EXTRA_TEXT, editText.getText().toString());
        
    target.onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, data);
    dismiss();
}

getDialog()で表示中のDialogを取得し、入力内容をfindViewById()を使ったりして取得します。

そして、Intentに結果を詰めて呼び出し元のonActivityResult()を直接呼んでしまいます。こうすることで

  • 呼び出し元はonActivityResult()で結果を処理すれば良い。
  • 同じDialogFragmentを、リクエストコードを変えて呼ぶことで使い回せる。例えばRequestCode = 1はメールアドレス入力用のダイアログ表示で、RequestCode = 2は名前入力用のダイアログ表示 といった感じ。
  • 呼び出し元がDialogFragmentであってもうまく動作する。

といったメリットがあります。

ActivityのshowDialog()を使っていた場合は、

  • DialogをActivityのInner Classにする
  • Activityにコールバック用のinterfaceを実装する

といった細工が必要だったと思います。これでは依存関係ができてしまい、部品化が進みません。

パターンと言えばパターンなので、覚えておきましょう!

1つ上へ / ブログトップへ