4

我想在 onBackPressed() 事件的 android 中显示一个警报对话框

DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {

    //@Override
    public void onClick(DialogInterface dialog, int which) {
        switch (which){
        case DialogInterface.BUTTON_POSITIVE:
            //Yes button clicked
            break;

        case DialogInterface.BUTTON_NEGATIVE:
            //No button clicked
            break;
        }
    }
};

但是在 onBackPressed() 事件中执行它时出现错误

@Override
public void onBackPressed() {
    super.onBackPressed();  
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Are you sure?").setPositiveButton("Yes", dialogClickListener)
        .setNegativeButton("No", dialogClickListener).show();

}

错误:“ com.java.mypkg 泄露了最初添加在这里的窗口 com.android.internal.policy.impl.PhoneWindow$DecorView@406c3798

我是否错过了什么。请帮忙。

4

6 回答 6

8

是的,不要按照以前用户的响应调用它。super.onBackPressed();Activity 的willonStop方法。而不是onBackPressed();你可以使用onKeyDown你的要求。如果您需要AlertDialog在按下后退按钮时打开一个,您可以简单地尝试使用KeyEvent

例如 -

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub

    switch(keyCode)
    {
    case KeyEvent.KEYCODE_BACK:
        AlertDialog.Builder ab = new AlertDialog.Builder(AlertDialogExampleActivity.this);
        ab.setMessage("Are you sure?").setPositiveButton("Yes", dialogClickListener)
        .setNegativeButton("No", dialogClickListener).show();
        break;
    }

    return super.onKeyDown(keyCode, event);
}

DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        switch (which){
        case DialogInterface.BUTTON_POSITIVE:
            //Yes button clicked
            break;

        case DialogInterface.BUTTON_NEGATIVE:
            //No button clicked
            break;
        }
    }
};

当您覆盖onKeyDown方法时,它将使用您的KEYCODE_BACK检测返回键

希望这对您有所帮助。

于 2012-07-30T04:38:42.800 回答
2

不要调用super.onBackPressed(); ,因为它会调用活动的 onStop 方法。

并且在已完成的活动上显示对话框,将泄漏窗口。

于 2012-07-30T04:28:27.087 回答
2
  1. 继续为这一行提供适当的上下文::

    AlertDialog.Builder builder = new AlertDialog.Builder(ActivityName.this);     
    
  2. 像这样适当地关闭警报对话框。

    new AlertDialog.Builder(ActivityName.this)  
    .setMessage("You have to Login first to apply.\nWant to login ?")  
    .setCancelable(false)  
    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {  
        public void onClick(DialogInterface dialog, int which)   
        {  
              // Perform Your Task Here--When Yes Is Pressed.  
              dialog.cancel();  
        }  
    })    
    .setNegativeButton("No", new DialogInterface.OnClickListener() {  
          public void onClick(DialogInterface dialog, int which)   
          {  
         // Perform Your Task Here--When No is pressed    
             dialog.cancel();  
          }  
    }).show();  
    

Window 泄露的这个错误是在 ::

  • 在具有不同上下文的活动中打开一个具有不同上下文的新窗口。

  • 退出 Activity 时未正确关闭窗口或对话框。

于 2012-07-30T04:51:41.227 回答
2

我的警报对话框方法:

public void message_dialog_yes_no (Activity activity, String msg, DialogInterface.OnClickListener yesListener) {
    AlertDialog.Builder builder = new AlertDialog.Builder(activity);

    builder.setMessage(msg)
           .setCancelable(false)
           .setPositiveButton("Yes", yesListener) 
           .setNegativeButton("No",  new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   dialog.cancel();
              }})              
           .show();
}

声明此方法后,我可以这样调用它:

DialogInterface.OnClickListener yesListener;

        yesListener = new DialogInterface.OnClickListener() {               
            public void onClick(DialogInterface dialog, int which) {
//codes
        }
        };

message_dialog_yes_no(this, "Confirm delete?" , yesListener);
于 2012-08-02T18:28:13.537 回答
1

super.onBackPressed()当您想要执行默认操作(即实际返回)而不是想要留在活动中时才应该调用。

有关如何正确覆盖的示例,请参阅此链接onBackPressed()

于 2012-07-30T04:33:02.200 回答
1

我们通常会在退出 Activity 时重写onBackPressed() 来执行一些条件。这意味着我们实际上是通过正常执行的 Back Press 事件,这不过是super.onBackPressed. 因此,将其包含在被覆盖的方法中意味着它还将遵循按下后退键时将执行的默认执行,并且我们自己的方法也将被执行。

但是在您的情况下,由于您在调用超类后尝试显示 AlertDialog ,因此您的 Activity 上下文不再可用,这意味着您的 Alert Dialog 没有窗口可以显示自身,因此出现泄漏窗口错误。

在这种情况下,您已经删除了超类调用。简单的。

于 2012-07-30T04:33:34.030 回答