9

我有一个活动,需要在其中显示对话框。这里一切正常。我在 Activity 中重写了 onCreateDialog 方法,代码如下:

@Override
protected Dialog onCreateDialog(int dialog)
{
    if(dialog == 10)
    {
        if(waitDialog != null)
            waitDialog.dismiss();

        dialogCreated = true;
        waitDialog = CreateWaitDialog(this); 
        return waitDialog;
    }
    else
        return new Dialog(this);
}

其中 CreateWaitDialog 是创建对话框的自定义方法,而 waitDialog 是静态变量。

我通过调用 showDialog(10) 来显示对话框

所有代码都执行良好。

显示对话框后,我通过调用将其关闭。

if(waitDialog != null)
    waitDialog.hide();

当 Activity 被销毁时,我将其解雇。

if(dialogCreated)
        dismissDialog(10);
    super.onDestroy();

它正在关闭,一切都很棒。但是,当我更改设备的方向并重新创建 Activity 时,它会自己再次弹出!我没有调用任何 showDialog 或类似的东西,它只是弹出!

4

3 回答 3

11

我认为这是 Activity 和onCreateDialog的定义行为:

用于创建由活动为您管理(保存和恢复)的对话框的回调。默认实现调用 onCreateDialog(int) 以实现兼容性。如果您的目标是 HONEYCOMB 或更高版本,请考虑改用 DialogFragment。

如果您使用 showDialog(int),则活动将第一次调用此方法,然后挂起。通过此方法创建的任何对话框都将自动为您保存和恢复,包括它是否正在显示。

如果您希望 Activity 为您管理保存和恢复对话框,您应该重写此方法并处理传递给 showDialog(int) 的任何 id。

我猜想 onDestroy 在活动生命周期中为时已晚,无法关闭对话框。我的猜测是 Activity 正在将您的对话框保存在 onSaveInstanceState 中。

我可能会在调用 super.onSaveInstanceState 之前尝试关闭 onSaveInstanceState 中的对话框,然后在 android 尝试保存和恢复它之前关闭对话框。

@Override
onSaveInstanceState(Bundle outstate) {

    dismissDialog(10);  
    super.onSaveInstanceState(outstate);
}
于 2012-10-24T19:17:43.030 回答
6

我发现自己遇到了类似的问题,因为我在没有调用 super.onDismiss() 的情况下覆盖了 onDismiss()。如果您发现在重新创建活动时再次出现对话框,您可能需要验证您没有犯同样的错误。

于 2014-06-30T00:09:10.870 回答
3

如果您想阻止应用程序继续保存和恢复您的对话框,请调用 Activity.removeDialog(int id)。

于 2013-09-17T18:51:31.550 回答