web-dev-qa-db-ja.com

Android:AlertDialogでonBackPressed()をオーバーライドする方法は?

別のAlertDialog dlgDetailsから表示されるAlertDialog dlgMenuがあります。ユーザーがdlgDetailsで戻るボタンを押した場合にdlgMenuを再度表示し、ダイアログの外側を押した場合はダイアログを終了できるようにしたいと思います。

これを行う最善の方法は、dlgDetailsのonBackPressedをオーバーライドすることですが、AlertDialogsはビルダーを使用して間接的に作成する必要があるため、その方法はわかりません。

派生AlertDialog(public class AlertDialogDetails extends AlertDialog { ...})を作成しようとしていますが、そのクラスのAlertDialog.Builderも拡張してAlertDialogDetailsを返す必要があると思いますが、もっと簡単な方法はありませんか?そうでない場合、ビルダーをオーバーライドするにはどうすればよいですか?

24
Pooks

最後に、ダイアログにキーリスナーを追加して、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 ...)
59
Pooks

より短い解決策が見つかりました:)これを試してください:

         accountDialog = builder.create();

        accountDialog.setOnCancelListener(new OnCancelListener() {

            @Override
            public void onCancel(DialogInterface dialog) {
                dialog.dismiss();
                activity.finish();

            }
        });
5
Lettings Mall

これは、[戻る]ボタンとダイアログの外側でのクリックの両方を処理します。

_yourBuilder.setOnCancelListener(new OnCancelListener() {
    @Override
    public void onCancel(DialogInterface dialog) {
        dialog.cancel();
        // do your stuff...
    }
});
_

dialog.cancel()がキーです。dialog.dismiss()を使用すると、上記で回答したように、ダイアログの外側のクリックのみが処理されます。

1
dentex

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
}

}
0
Deepak Negi