Android中的是/否警报对话框

时间:2012-07-30 04:23:24

标签: android

我想在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

我错过了什么吗?请帮助。

6 个答案:

答案 0 :(得分:7)

是的,不要按照之前用户的回复来调用它。 super.onBackPressed();onStop方法的活动。而不是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

后退密钥

希望这会对你有所帮助。

答案 1 :(得分:2)

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

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

答案 2 :(得分: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();  
    
  3. 窗口泄露的错误是在::

    时引起的
    • 在Activity中打开一个具有不同上下文的新窗口    不同的背景。

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

答案 3 :(得分:2)

我的alertdialog方法:

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);

答案 4 :(得分:1)

如果您想要执行默认操作(即实际返回),则应该只调用super.onBackPressed(),如果您想留在活动中,则不应该调用。

有关如何正确覆盖onBackPressed()的示例,请参阅this link

答案 5 :(得分:1)

我们通常会覆盖onBackPressed()以在退出Activity时执行某些条件。这意味着我们实际上是通过传递Back Press事件的正常执行,这只是super.onBackPressed。因此,将其置于覆盖方法中意味着它还将遵循按下后退键时将执行的默认执行,并且还将执行我们自己的方法。

但是在你的情况下,因为你试图在调用超类后显示一个AlertDialog,你的Activity上下文不再可用,这意味着你的Alert Dialog没有窗口显示自己,因此泄露的窗口错误。

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