屏幕旋转后恢复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
相关产品推荐
相关产品推荐

