Activity与Dialog全屏设置

719 阅读1分钟

首次启动Activity

在setContentView之前设置

FullScreenUtils.fullScreenImmersive(getWindow());
public static void fullScreenImmersive(Window window) {
    View decorView = window.getDecorView();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_FULLSCREEN
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
        decorView.setSystemUiVisibility(uiOptions);
    }

    WindowManager.LayoutParams attributes = window.getAttributes();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            attributes.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
        } else {
            attributes.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
        }
    }
    window.setAttributes(attributes);
}

由于窗口变更以后会触发焦点丢失,导致退出全屏。

在Activity和Dialog的onWindowFocusChanged上需要再次设置

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
        FullScreenUtils.fullScreenImmersive(getWindow());
    }
}

弹出Dialog时

Activity设置完全屏以后,会退出全屏再进入Dialog的全屏,为了规避此问题,需要现在将dialog的窗口焦点设置为不聚焦,再显示完以后设置为聚焦

@Override
public void show() {
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
    super.show();
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
}

进入后台再回来

当Activity的Dialog弹出以后,进入后台再回到App,Activity退出全屏,会显示白边

image.png 还需要在Activity的onStart时再次设置

@Override
protected void onStart() {
    super.onStart();
    FullScreenUtils.fullScreenImmersive(getWindow());
}

弹出Dialog时,并不会触发Activity声明周期变化,只会触发onWindowFocusChanged, 而弹出Dialog时,当Activity进入后台再回来,并不会触发它的onWindowFocusChanged,只会触发生命周期方法