阅读 447

Android Dialog 抖动

现象

当设置dialog的WindowManager.LayoutParams的widthheightWindowManager.LayoutParams.MATCH_PARENT的时候,dialog弹出后出现抖动。

代码如下:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Window window = getWindow();
    WindowManager.LayoutParams params = window.getAttributes();
    params.width = WindowManager.LayoutParams.MATCH_PARENT;
    params.height = WindowManager.LayoutParams.MATCH_PARENT; 
    window.setAttributes(params); 
}复制代码

原因

  1. 网上有人说是因为在上述代码在onShow()中调用的原因,将代码放在onCreate()即可。有上述情况的同学可以参考修改。

  2. 当前界面处于全屏状态(WindowManager.LayoutParams.FLAG_FULLSCREEN)。当显示dialog时,因为dialog没有同步设置全屏,导致在显示过程中界面会重新显示出状态栏,从而造成dialog显示的时候出现上下抖动的现象。

方案

针对原因二: 在创建dialog的时候判断当前界面是否为全屏,同步设置和当前界面一样的状态即可。

参考代码:

import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

public class CustomDialog extends Dialog {

    public CustomDialog(Context context) {
        this(context, 0);
    }

    public CustomDialog(Context context, int themeResId) {
        super(context, themeResId);
        if (context instanceof Activity) {
            setOwnerActivity((Activity) context);
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Window window = getWindow();
        WindowManager.LayoutParams params = window.getAttributes();
        params.width = WindowManager.LayoutParams.MATCH_PARENT;
        params.height = WindowManager.LayoutParams.MATCH_PARENT;
        if (isFullScreen(getOwnerActivity())) {//判断是不是全屏
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
        }
        window.setAttributes(params);
    }

    private boolean isFullScreen(Activity activity) {
        if (activity == null) {
            return false;
        }
        int flags = activity.getWindow().getAttributes().flags;
        return (flags & WindowManager.LayoutParams.FLAG_FULLSCREEN) ==
                WindowManager.LayoutParams.FLAG_FULLSCREEN;
    }

}


作者:夏碧笔
链接:https://juejin.cn/post/7021434436847665189


文章分类
后端
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐