Experiments Never Fail

ダイアログを二重に開かないようにする

Android なのか Java なのかどっちの仕様か知らないですが、どうやらこちらの世界には「モーダルダイアログ」という概念がないみたいで。

なので以下のようなコードを書くと、連続でボタンをタップすると、ダイアログが二重三重に表示されてしまいます。

ダイアログが二重に開いちゃうコード

Button button = (Button)findViewById(R.id.Button1);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// 再現しやすいように少し負荷をかける
SystemClock.sleep(1000);

AlertDialog dlg = new AlertDialog.Builder(v.getContext()).create();
dlg.setTitle("ほげ");
dlg.setMessage("ほげほげ");
dlg.setButton("閉じる", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
dlg.show();
}
});

で自分が考えた対策がこれ。

二重に開かないコード

Button button = (Button)findViewById(R.id.Button1);
stopButton.setOnClickListener(new View.OnClickListener() {
// メンバとして宣言
AlertDialog dlg = new AlertDialog.Builder(LoggingActivity.this).create();

public void onClick(View v) {
// 表示されてたら何もしない
if (dlg.isShowing()) {
return;
}

// 再現しやすいように少し負荷をかける
SystemClock.sleep(1000);

dlg.setTitle("ほげ");
dlg.setMessage("ほげほげ");
dlg.setButton("閉じる", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
dlg.show();
}
});

匿名クラスではコンストラクタが使えないので、dlg.setTitle とか何回もよばれちゃうのが気に入らないけど、まあ目的は達成できたのでこれでいいかなと。 C# なら 2〜3行で書けるのに〜。

published at tags: Android Java