テキストを入力したり、はい/いいえを選んでもらうためにダイアログを表示すると思います。今回はその結果を呼び出し元に伝える方法を紹介します。
まず、前回説明を省略した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()を直接呼んでしまいます。こうすることで
といったメリットがあります。
ActivityのshowDialog()を使っていた場合は、
といった細工が必要だったと思います。これでは依存関係ができてしまい、部品化が進みません。
パターンと言えばパターンなので、覚えておきましょう!