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行で書けるのに〜。

Android
Java

published

Ads

Read more!

amay077

Microsoft MVP(Xamarin). フルリモートワーカー. Geospatial Mobile app developer. Love C#.

amay077 amay077