【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; }
本日はここまで。
コメントをどうぞ