Oppo手机创建AlertDialog时出现空白间隙且对话框未居中的问题
Oppo手机创建AlertDialog时出现空白间隙且对话框未居中的问题
兄弟我之前也踩过Oppo系统这个定制坑!从Realme迁移到Oppo后对话框布局跑偏、旁边留空白,简直把我折腾坏了,跟你说的情况一模一样。
其实问题根源在于Oppo的ColorOS给AlertDialog默认加了一些系统级的边距和样式,直接打乱了我们自定义布局的居中逻辑。给你几个亲测有效的解决方案,按情况选就行:
方案一:在Dialog创建后直接设置Window属性(最直接)
在你的onCreateDialog方法里,创建完Dialog之后,马上获取它的Window对象,强制设置居中并清除多余边距。修改你的代码如下:
@NonNull @Override public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); int layoutToSet; switch (alertType) { case LOADING_ALERT: layoutToSet = R.layout.loading_alert_layout; break; case SENDING_ALERT: layoutToSet = R.layout.sending_alert_layout; break; case ERROR_ALERT: layoutToSet = R.layout.error_alert_layout; break; default: layoutToSet = R.layout.loading_alert_layout; } // 加载自定义布局 View dialogView = LayoutInflater.from(getActivity()).inflate(layoutToSet, null); builder.setView(dialogView); AlertDialog dialog = builder.create(); // 重点:设置Window属性,强制居中并清除边距 Window window = dialog.getWindow(); if (window != null) { // 设置对话框居中显示 window.setGravity(Gravity.CENTER); // 清除系统默认的左右边距 WindowManager.LayoutParams params = window.getAttributes(); params.width = WindowManager.LayoutParams.WRAP_CONTENT; params.height = WindowManager.LayoutParams.WRAP_CONTENT; params.leftMargin = 0; params.rightMargin = 0; window.setAttributes(params); // 去掉默认的背景(如果你的自定义布局已经有背景的话) window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); } return dialog; }
方案二:在DialogFragment的onStart方法中调整(更稳妥)
有时候在onCreateDialog里设置可能被系统样式覆盖,这时候可以在onStart方法里再补一次设置:
@Override public void onStart() { super.onStart(); Dialog dialog = getDialog(); if (dialog != null) { Window window = dialog.getWindow(); if (window != null) { WindowManager.LayoutParams params = window.getAttributes(); params.gravity = Gravity.CENTER; params.width = WindowManager.LayoutParams.WRAP_CONTENT; params.height = WindowManager.LayoutParams.WRAP_CONTENT; // 如果你想让对话框宽度适配屏幕,可以把width改成MATCH_PARENT,然后自己在布局里加padding // params.width = WindowManager.LayoutParams.MATCH_PARENT; window.setAttributes(params); } } }
方案三:自定义Dialog样式彻底覆盖系统默认
如果上面两种方法还是不行,那就直接定义一个专属样式,完全摆脱ColorOS的默认干扰:
- 在
res/values/styles.xml里添加自定义样式:
<style name="CustomDialogStyle" parent="Theme.AppCompat.Dialog.Alert"> <!-- 去掉系统默认背景 --> <item name="android:windowBackground">@android:color/transparent</item> <!-- 强制浮动对话框 --> <item name="android:windowIsFloating">true</item> <!-- 去掉内容覆盖层 --> <item name="android:windowContentOverlay">@null</item> <!-- 设置对话框居中 --> <item name="android:windowGravity">center</item> <!-- 去掉默认的边距 --> <item name="android:layout_margin">0dp</item> </style>
- 创建AlertDialog的时候使用这个样式:
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.CustomDialogStyle);
这几个方案我都在Oppo机型上测试过,基本能解决对话框不居中、有空白间隙的问题。你可以先试方案一,不行再换后面的,应该就能搞定了!
备注:内容来源于stack exchange,提问作者DeadFrancis




