hyoromoのブログ

最近はVRSNS向けに作ったものについて書いています

Dialogの実装方法を整理してみたよ

処理の合間、合間に表示させる Dialog について整理してみました。

Dialogの種類

Androidのダイアログでよく使うのは二種類くらいかと思います。

  1. プログレスダイアログ
    android.app.ProgressDialog
    ユーザーに待機させるときに使用します
    ProgressDialog

  2. アラートダイアログ
    android.app.AlertDialog
    ユーザーに確認させたいときに使用します
    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はアプリケーション開発する上で必ず必要になるので、テンプレートを作成して使い回すのがいいと思います。

参考

「Enter=実行」の実装方法は、前に androidメーリングリストのどこかで流れてた投稿メールを参考にしました。
ありがとうございます。

*1:少しキー入力がモッサリするかもしれません