Gostaria de saber um método para entrar e sair do modo tela cheia programaticamente, ou seja, em tempo de execução do app. Ex: ao clicar em um botão entra em modo tela cheia e ao clicar em outro sai do modo tela cheia.
Já vi muito código na internet ensinando a entrar no modo tela cheia (quase todos falhos), mas não vi um que funcione para sair do modo tela cheia. Sempre fica algo esquisito no layout da tela ao sair do modo tela cheia (por exemplo, a action bar sobrepõe parcialmente o conteúdo visual da tela ao sair do modo tela cheia programaticamente).
Abaixo segue o código que estou usando (não funciona bem para sair do modo tela cheia)...
public static void enterFullScreenMode(Activity activity, boolean keepScreenOn, @IdRes int... viewId) {
Window window = activity.getWindow();
View decorView = window.getDecorView();
WindowInsetsControllerCompat windowInsetsControllerCompat = new WindowInsetsControllerCompat(window, decorView);
decorView.setKeepScreenOn(keepScreenOn);
//
window.getDecorView().setSystemUiVisibility(
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 // hide nav bar
| View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
| View.SYSTEM_UI_FLAG_IMMERSIVE
);
//
windowInsetsControllerCompat.hide(WindowInsetsCompat.Type.systemBars());
windowInsetsControllerCompat.setSystemBarsBehavior(WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
//
FullScreenUtil.hideView(activity, viewId);
//
decorView.requestLayout();
}
public static void exitFullScreenMode(Activity activity, boolean keepScreenOn, @IdRes int... viewId) {
Window window = activity.getWindow();
View decorView = window.getDecorView();
WindowInsetsControllerCompat windowInsetsControllerCompat = new WindowInsetsControllerCompat(window, decorView);
decorView.setKeepScreenOn(keepScreenOn);
//
window.getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
);
windowInsetsControllerCompat.show(WindowInsetsCompat.Type.systemBars());
windowInsetsControllerCompat.setSystemBarsBehavior(WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_TOUCH);
//
FullScreenUtil.showView(activity, viewId);
//
decorView.requestLayout();
}
private static void hideView(Activity activity, int... viewIdList) {
for (int viewId : viewIdList) {
FullScreenUtil.setViewVisibity(false, activity, viewId);
}
}
private static void showView(Activity activity, int... viewIdList) {
for (int viewId : viewIdList) {
FullScreenUtil.setViewVisibity(true, activity, viewId);
}
}
private static void setViewVisibity(boolean visible, Activity activity, int viewId) {
if (viewId != 0) {
View view = activity.findViewById(viewId);
if (view != null) {
view.setVisibility(View.GONE);
}
}
}