You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

屏幕旋转后恢复AlertDialog异常问题求解决方案

修复屏幕旋转后AlertDialog不显示的问题

我完全理解你不想切换到DialogFragment的诉求,咱们直接针对现有代码的问题来修复。

问题根源

你遇到的核心问题是:在onCreate中直接调用showErrorDialog()时,Activity的布局还没完成测量和绘制,这时候rl.getWidth()会返回0。你设置对话框宽度为0.9 * width,相当于把对话框宽度设为0,所以对话框本身不可见,但窗口的遮罩(变暗效果)依然生效,就出现了屏幕暗却看不到对话框的情况。

修复方案

1. 延迟执行对话框显示,等待视图加载完成

我们可以利用View.post()方法,确保在Activity的视图完全布局完成后,再去获取布局宽度并显示对话框。修改你的onCreate代码如下:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.some_activity);

    if (savedInstanceState != null) {
        hasErrorDialog = savedInstanceState.getBoolean("HASERRORDIALOG");
        if (hasErrorDialog) {
            // 延迟到视图布局完成后再执行
            findViewById(R.id.someActivity).post(new Runnable() {
                @Override
                public void run() {
                    showErrorDialog();
                }
            });
        }
    }
}

2. 避免内存泄漏,清理对话框引用

另外,建议在Activity销毁时主动关闭对话框,避免旋转后残留无效的对话框引用:

@Override
protected void onDestroy() {
    super.onDestroy();
    if (alertDialog != null && alertDialog.isShowing()) {
        alertDialog.dismiss();
        alertDialog = null;
    }
}

为什么这样有效?

View.post()会把Runnable加入到UI线程的消息队列中,等到当前视图树完成布局、测量流程后才会执行。这时候调用showErrorDialog(),rl.getWidth()就能拿到正确的布局宽度,对话框的尺寸设置正常,自然就能显示出来了。

你的showErrorDialog()方法本身不需要修改,只要确保它在视图布局完成后被调用即可。

内容的提问来源于stack exchange,提问作者Tim Biegeleisen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:49:23