DialogFragmentで表示後のダイアログの書き換え
DialogFragmentはAlertDialogなどのダイアログクラスを内部に保有するのでダイアログの内容を表示後に変更したい場合はライフサイクルについて理解する必要があります。
DialogFragmentのライフサイクルは次のようになっています。
- onCreate
- onCreateDialog
- show
- onCreateView
- onStart
DialogFragmentではonCreateかonCreateDialogのどちらかでダイアログを生成します。独自のレイアウトを使うときはonCreate、レイアウトを利用しないときはonCreateDialogを使うようです。
ここでshowメソッドでダイアログを表示した後にダイアログの内容(タイトルやアイコンなど)を変更したい場合、次のようにgetDialogからダイアログを取得できます。
getDialog().setTitle("Title"); ///タイトルを変更
onStartメソッドはダイアログが実際に表示された後に呼ばれるのでダイアログに対する変更はその前のonCreateViewメソッド内で行うのが良いと思います。
ダイアログ例
では、実際にshowした後にタイトルとメッセージを書き換えられるようなDialogFragmentを紹介します。
ここではMyDialogFragmentというクラス名で次のようなコードを書きました。
/** タイトルとメッセージが編集可能なダイアログ*/ public class MyDialogFragment extends DialogFragment { private String title; private String message; public static MyDialogFragment newInstance() { return new MyDialogFragment(); } /** OKボタンだけを持つダイアログを作る。*/ @Override public Dialog onCreateDialog(Bundle bundle) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dismiss(); } }); return builder.create(); } /** ダイアログのタイトル設定*/ public void setTitle(String title) { this.title = title; } /** メッセージ設定*/ public void setMessage(String message) { this.message = message; } /** show後に変更を適用する。*/ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { AlertDialog dialog = (AlertDialog)getDialog(); dialog.setTitle(title); dialog.setMessage(message); return super.onCreateView(inflater, container, savedInstanceState); }
setTitleとsetMessageというメソッドを作り、show後でも内容を変更できるようにしてあります。もちろん必要ならタイトルやアイコン、OKボタン、キャンセルボタンなども書き換え可能です。
こうするとActivity内でshowした後に好きなようにタイトル、メッセージの書き換えができます。
MessageDialogFragment dialog = MessageDialogFragment.newInstance(); dialog.show(getSupportFragmentManager(), MessageDialogFragment.class.getName()); dialog.setTitle("Title"); dialog.setMessage("Hello!!");
上の画像が実際に表示されたダイアログです。
ちなみにshowメソッドのすぐ後にgetDialogを呼び出すとnullが返ってきます。
なので、getDialogはpublicな関数ですが、なるべくならDialogFragment内で呼び出した方が安全です。
以上、DialogFragmentを表示後にカスタマイズする方法でした。では、また!