首次启动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退出全屏,会显示白边
还需要在Activity的onStart时再次设置
@Override
protected void onStart() {
super.onStart();
FullScreenUtils.fullScreenImmersive(getWindow());
}
弹出Dialog时,并不会触发Activity声明周期变化,只会触发onWindowFocusChanged, 而弹出Dialog时,当Activity进入后台再回来,并不会触发它的onWindowFocusChanged,只会触发生命周期方法