【问题标题】:Android Dialog is showing again after Activity is re-created重新创建 Activity 后再次显示 Android 对话框
【发布时间】:2012-10-24 19:04:56
【问题描述】:

我有一个 Activity,需要在其中显示 Dialog。这里一切正常。我在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 或类似的东西,它只是弹出!

【问题讨论】:

    标签: android android-activity android-dialog


    【解决方案1】:

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

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

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

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

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

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

    @Override
    onSaveInstanceState(Bundle outstate) {
    
        dismissDialog(10);  
        super.onSaveInstanceState(outstate);
    }
    

    【讨论】:

    • 我讨厌相互竞争的答案,因为你花了额外的时间来引用文档,我删除了我的答案并给了你一个赞成票。
    • @Sam 我认为您的回答仍然有价值,我会留下它。他可能真的应该调用dismiss而不是hide,我的回答只是猜测/破解onCreateDialog的默认行为。我认为你的可能是更好的解决方案。
    • 我只是仔细检查了源代码,如果对话框重复显示,使用hide() 是一种更快的方法。此外,您的答案可能是一个猜测,但它是有充分根据且正确的。所以我很高兴留下我的赞成票。
    • 很高兴它有帮助。请注意,如果您在对话框关闭之前旋转屏幕,它会消失,不确定这是不是您的意图。
    • 我用一些标志处理了它 :) 有没有更优雅的解决方案?
    【解决方案2】:

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

    【讨论】:

    • 哦,谢谢你,伙计!
    【解决方案3】:

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

    【讨论】:

    • 这种方法允许没有显示的对话框(dismissDialog 抛出错误),因此可以删除任何和所有可能使用 onCreateDialog 显示的对话框。
    猜你喜欢
    • 2017-11-02
    • 2011-07-10
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多