Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:如何在AlertDialog中覆盖onBackPressed()?_Android_Overriding_Android Dialog - Fatal编程技术网

Android:如何在AlertDialog中覆盖onBackPressed()?

Android:如何在AlertDialog中覆盖onBackPressed()?,android,overriding,android-dialog,Android,Overriding,Android Dialog,我有一个AlertDialog dlgDetails,它是从另一个AlertDialog dlgMenu显示的。如果用户按下dlgDetails中的back按钮,我希望能够再次显示dlgMenu,如果用户在对话框外按下,则只需退出对话框 我认为最好的方法是覆盖dlgDetails的onBackPressed,但我不确定如何做,因为必须使用生成器间接创建AlertDialogs 我试图创建一个派生的AlertDialog(public类AlertDialogDetails扩展了AlertDialo

我有一个
AlertDialog dlgDetails
,它是从另一个
AlertDialog dlgMenu
显示的。如果用户按下dlgDetails中的back按钮,我希望能够再次显示dlgMenu,如果用户在对话框外按下,则只需退出对话框

我认为最好的方法是覆盖dlgDetails的
onBackPressed
,但我不确定如何做,因为必须使用生成器间接创建AlertDialogs


我试图创建一个派生的AlertDialog(
public类AlertDialogDetails扩展了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 ...)
有关Kotlin的答案,请参见此处:

找到了一个较短的解决方案:)请尝试以下方法:

         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.dismise()
这将只处理对话框外部的单击,如上所述。

我在java类中创建了一个新函数,并从dialog Builder的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
}

}

我找到了一种方法,在创建对话框时使用setOnKeyListener(),但仍然觉得使用onBackPressed是最好的方法。如果没有人能想出比setOnKeyListener()更好的解决方案,那么我会在几个小时后发布我的答案(网站现在也不允许我发布)。我也有同样的问题。但我在科特林编程。如果有人使用Kotlin,我的问题将有助于他/她:+1谢谢,它工作得很好!遗憾的是,方法
setOnBackPressed()
不存在,因此我想这是最简单的方法。最后,我的对话框的后退按钮处理的有效解决方案。在按下后退按钮时有效。在对话框外单击不起作用。我也有同样的问题。但我在科特林编程。如果有人使用Kotlin,我的问题会帮助他/她:这是一个很好的解决方案,但是当用户按下后退按钮和在对话框外单击时,不会调用onCancel()?我需要区分这两种情况。按下后退按钮时不会调用此侦听器。要处理后退按钮和对话框外的单击:请注意,setOnCancelListener()适用于API 17和更高版本。我遇到了相同的问题。但我在科特林编程。如果有人使用Kotlin,我的问题将帮助他/她:谢谢你的建议。然而,这个想法不是要创建一个称为“后退”的负按钮,而是在显示对话框时对手机的后退键进行特殊处理。处理活动的onBackPressed没有帮助,因为我们不知道对话框是否正在显示,而不必添加标志,这有点混乱。我也有同样的问题。但我在科特林编程。如果有人使用Kotlin,我的问题将帮助他/她:我使用OnDismissListener,因为它处理背面、外部和负片按钮。我也有同样的问题。但我在科特林编程。如果有人使用Kotlin,我的问题将帮助他/她: