お使いのブラウザは、バージョンが古すぎます。

このサイトは、Internet Explore8・Internet Explore9には対応しておりません。
恐れ入りますが、お使いのブラウザをバージョンアップしていただきますよう宜しくお願いいたします。

【Android Tips】AlertDialog作成をまとめるクラスを作る③~ダイアログをカスタマイズした時に注意すべき事

前回前々回とダイアログの作成をまとめるクラスについて書いてきました。
今回はダイアログを複数使用するアプリを作成していた時にハマったことについて書きたいと思います。

 

まず陥ったのがダイアログが二重に表示されるという問題でした。

状況によっては、違うメッセージのダイアログが重なって表示されたり、同じダイアログが2つ表示されたりと、消しても消してもイタチごっこでした。

そこで、前に表示されているダイアログがある場合には消すという処理を前回のコードに足します。

@Override
protected void onPrepareDialog(int id, Dialog dialog){
    super.onPrepareDialog(id, dialog);
    // ここに、ダイアログの表示前に必要な処理を記述する。
    if(dialogId != 0) {
       dismissDialog(dialogId);
    }

    dialogId = id;
}

これで、1つ前に表示されたダイアログを、次のダイアログを表示する前に消すことが出来ました。

 

次に陥ったのが、ダイアログの中身が更新されないという問題でした。

使っていたのはTextViewをセットしたカスタムのダイアログで、TextVIewの中身を書き換えても表示が更新されない状況に。

 

原因はonCreateDialog()が呼ばれないためでした。

onCreateDialog()は、初めてダイアログが生成される時にしか呼ばれないため、2度目以降のshowDialog()では初めにセットしたViewがそのまま使われていたのです。

そのため、Viewをセットするなどカスタムのダイアログを使用した場合には、そのダイアログを消す時にremoveDialog()する必要があります。

(ダイアログを更新しない場合は必要ありませんが…)

ということで、ダイアログのonClickの処理でremoveDialog()も実行することにしました。

@Override
public void onClick(DialogInterface dialog, int which) {
   switch(which){
   case DialogInterface.BUTTON_POSITIVE:
       //--- OKボタン ---
       dialog.dismiss();
       switch(dialogId){
       case 100:
          removeDialog(100);
          break;
       }
       break;
   case DialogInterface.BUTTON_NEGATIVE:
       //--- キャンセルボタン ---
       dialog.cancel();
   }
}

 

ここまで作ってさらに問題が。
最初に作った「前のダイアログを消す」という処理でエラーが!

どうも、removeされたダイアログをdismissしようとするとIllegalArgumentExceptionが発生するようです。

dismiss処理を行わないように変数dialogIdを0でリセットする…
という考えもあったのですが、とりあえずtry~catchで捕まえることにしました。

@Override
protected void onPrepareDialog(int id, Dialog dialog){
    super.onPrepareDialog(id, dialog);
    // ここに、ダイアログの表示前に必要な処理を記述する。
    try{
       if(dialogId != 0) {
           dismissDialog(dialogId);
       }
    }catch(IllegalArgumentException e){
       //ダイアログがremoveされていた場合にトレース
       e.printStackTrace();
    }
    dialogId = id;
}

本日はここまで。

コメントをどうぞ

メールアドレスは公開されません。* が付いている欄は必須項目です。


お気軽にお問い合わせください。

日本VTR実験室では、お仕事のご依頼、ブログ・コラムのご感想などを受け付けております。
アプリ開発・コンテンツ制作でお困りでしたら、お気軽にご相談ください。
ご連絡お待ちしております。

お問い合わせはこちらから

03-3541-1230

info@nvtrlab.jp

電話受付対応時間:平日AM9:30〜PM6:00