処理の合間、合間に表示させる Dialog について整理してみました。
Dialogの種類
Androidのダイアログでよく使うのは二種類くらいかと思います。
- プログレスダイアログandroid.app.ProgressDialogユーザーに待機させるときに使用します
- アラートダイアログandroid.app.AlertDialogユーザーに確認させたいときに使用します
ProgressDialog実装方法
表示
String title = getResources().getString(R.string.progress_dialog_name_title); String mes = getResources().getString(R.string.progress_dialog_name_mes); ProgressDialog mProgressDialog = ProgressDialog.show(this, title, mes, true);
これで Dialog が表示されます。
閉じる処理をしなければ開きっぱなしになるので注意が必要です。
閉じる
mProgressDialog.dismiss();
これで閉じられます。
AlertDialog実装方法
レイアウト
dialog_entry.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/dialog_view" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_marginLeft="20dip" android:layout_marginRight="20dip" android:text="@string/alert_dialog_name1_mes" android:gravity="left" android:textAppearance="?android:attr/textAppearanceMedium" /> <EditText android:id="@+id/username_edit" android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_marginLeft="20dip" android:layout_marginRight="20dip" android:scrollHorizontally="true" android:autoText="false" android:capitalize="none" android:gravity="fill_horizontal" android:textAppearance="?android:attr/textAppearanceMedium" /> </LinearLayout>
表示/閉じる
LayoutInflater factory = LayoutInflater.from(this); final View entryView = factory.inflate(R.layout.dialog_entry, null); final EditText edit = (EditText) entryView.findViewById(R.id.username_edit); // AlertDialog作成 AlertDialog mAlertDialog = new AlertDialog.Builder(this) .setIcon(R.drawable.icon) .setTitle(R.string.alert_dialog_name1_title) .setView(entryView) .setPositiveButton(R.string.alert_dialog_name1_button1, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { String editStr = edit.getText().toString(); // OKボタン押下時のハンドリング Log.v(TAG, editStr); } }).setNegativeButton(R.string.alert_dialog_name1_button2, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // NOボタン押下時のハンドリング } }).create(); mAlertDialog.show();
ボタンが押されたら閉じます。ボタン数は1から3つまで付けることができます。
1つハマるかもしれないポイントがあります。Dialog上の Widgetを参照する場合、this ではなく widgetが乗っているview を指定してください。
余談
// キーハンドリング edit.setOnKeyListener(new View.OnKeyListener(){ public boolean onKey(View v, int keyCode, KeyEvent event) { // Enterキーハンドリング if (KeyEvent.KEYCODE_ENTER == keyCode) { // 押したときに改行を挿入防止処理 if (KeyEvent.ACTION_DOWN == event.getAction()) { return true; } // 離したときにダイアログ上の[OK]処理を実行 else if (KeyEvent.ACTION_UP == event.getAction()) { if (edit != null && edit.length() != 0) { // ここで[OK]が押されたときと同じ処理をさせます String editStr = edit.getText().toString(); // OKボタン押下時のハンドリング Log.v(TAG, editStr); // AlertDialogを閉じます mAlertDialog.dismiss(); } return true; } } return false; } });
先ほどのソース内に「キーハンドリング」を埋め込めば、Enterを押したときにDialogのボタンが押されたかのような動作をさせることができます。機能として欲しければ実装してください*1。
Enterが押されたときにOKがクリックされた事にしたかったのですが、実装方法が分からず同じ処理を記述しています。OKをクリックしたことにする実装方法があれば教えてください。
全体のソース
GitHubに置きました。
AlertDialog で、ボタンが1つのパターンも実装していますので参考にしてみてください。
また、ブログに載せたソースは元のを改変しているので動かない可能性があります。コピーして使うならGitHubに置いてあるソースの方が安全です。
まとめ
Dialogはアプリケーション開発する上で必ず必要になるので、テンプレートを作成して使い回すのがいいと思います。
*1:少しキー入力がモッサリするかもしれません