以前はダイアログを作成するのはなかなかコードの量が多く大変だったのですが、
DialogFragmentにより簡単に作成できるようになりました。
DialogFragmentはAPIレベル11から追加されています。
Android Studioで自動生成されるFragment(Blank)のテンプレートを利用して ダイアログを作成すると簡単に作成できます。
public class MessageDialogFragment extends DialogFragment {
private static final String TITLE = "title";
private static final String MESSAGE = "message";
private String mTitle;
private String mMessage;
//OKボタンが押されたことを通知するリスナー
private OnOkButtonClickedListener mListener;
public static MessageDialogFragment newInstance(String title, String message) {
MessageDialogFragment fragment = new MessageDialogFragment();
Bundle args = new Bundle();
args.putString(TITLE, title);
args.putString(MESSAGE, message);
fragment.setArguments(args);
return fragment;
}
public MessageDialogFragment() {
//何も書かない
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mTitle = getArguments().getString(TITLE);
mMessage = getArguments().getString(MESSAGE);
}
//ダイアログの作成
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(mTitle)
.setMessage(mMessage)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
mListener.onOkButtonClicked();
}
});
return builder.create();
}
@Override
public void onAttach(Activity activity) {
//リスナーのセット
super.onAttach(activity);
try {
mListener = (OnOkButtonClickedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnOkButtonListener");
}
}
@Override
public void onDetach() {
//リスナーの削除
super.onDetach();
mListener = null;
}
public interface OnOkButtonClickedListener {
public void onOkButtonClicked();
}
}
DialogFragmentで注意が必要なのは、onCreateViewは必ず消して下さい。
残っているとエラーが発生してアプリが強制終了します。
ダイアログを表示させるActivityは以下のようにします。
public class MainActivity extends ActionBarActivity implements View.OnClickListener, MessageDialogFragment.OnOkButtonClickedListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Button btnPush = (Button)findViewById(R.id.btn_push);
btnPush.setOnClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onClick(View v) {
MessageDialogFragment dialog = MessageDialogFragment.newInstance("タイトル", "メッセージ");
dialog.show(getSupportFragmentManager(), "dialog");
}
@Override
public void onOkButtonClicked() {
//今回は何もしない
}
}
この時、注意が必要なのは、onAttachでactivityをキャストしているので
必ずFragmentで作成したinterfaceをimplementsして下さい。
今回はボタンクリックでダイアログを表示させるので、
onClickの中でnewInstanceした後、dialog.showで表示します。
以上です。

