別のAlertDialog dlgDetails
から表示されるAlertDialog dlgMenu
があります。ユーザーがdlgDetailsで戻るボタンを押した場合にdlgMenuを再度表示し、ダイアログの外側を押した場合はダイアログを終了できるようにしたいと思います。
これを行う最善の方法は、dlgDetailsのonBackPressed
をオーバーライドすることですが、AlertDialogsはビルダーを使用して間接的に作成する必要があるため、その方法はわかりません。
派生AlertDialog(public class AlertDialogDetails extends AlertDialog { ...}
)を作成しようとしていますが、そのクラスのAlertDialog.Builder
も拡張してAlertDialogDetailsを返す必要があると思いますが、もっと簡単な方法はありませんか?そうでない場合、ビルダーをオーバーライドするにはどうすればよいですか?
最後に、ダイアログにキーリスナーを追加して、Backキーをリッスンしました。 onBackPressed()
をオーバーライドするほどエレガントではありませんが、機能します。これがコードです:
dlgDetails = new AlertDialog.Builder(this)
.setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey (DialogInterface dialog, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK &&
event.getAction() == KeyEvent.ACTION_UP &&
!event.isCanceled()) {
dialog.cancel();
showDialog(DIALOG_MENU);
return true;
}
return false;
}
})
//(Rest of the .stuff ...)
より短い解決策が見つかりました:)これを試してください:
accountDialog = builder.create();
accountDialog.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
dialog.dismiss();
activity.finish();
}
});
これは、[戻る]ボタンとダイアログの外側でのクリックの両方を処理します。
_yourBuilder.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
dialog.cancel();
// do your stuff...
}
});
_
dialog.cancel()
がキーです。dialog.dismiss()
を使用すると、上記で回答したように、ダイアログの外側のクリックのみが処理されます。
Javaクラス内に新しい関数を作成し、ダイアログビルダーのonClickメソッドからその関数を呼び出しました。
public class Filename extends Activity(){
@Override
onCreate(){
//your stuff
//some button click launches Alertdialog
}
public void myCustomDialog(){
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
//other details for builder
alertDialogBuilder.setNegativeButton("BACK",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialod.dismiss;
myCustomBack();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.setCanceledOnTouchOutside(true);
alertDialog.show();
}
public void myCustomBack(){
if(condition1){
super.onBackPressed();
}
if(condition 2){
//do stuff here
}
}
@Override
public void onBackPressed(){
//handle case here
if (condition A)
//Do this
else
//Do that
}
}