You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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的默认干扰:

  1. 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>
  1. 创建AlertDialog的时候使用这个样式:
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.CustomDialogStyle);

这几个方案我都在Oppo机型上测试过,基本能解决对话框不居中、有空白间隙的问题。你可以先试方案一,不行再换后面的,应该就能搞定了!

备注:内容来源于stack exchange,提问作者DeadFrancis

火山引擎 最新活动