1
resposta

Como entrar e sair do modo tela cheia (full screen)?

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);
            }
        }
    }
1 resposta

Olá Marcelo! Como vai?

Entendo que você esteja enfrentando dificuldades para sair do modo tela cheia programaticamente no seu aplicativo. Realmente, pode ser um desafio encontrar um código que funcione corretamente nessa situação.

Pelo código que você compartilhou, parece que você está no caminho certo para entrar no modo tela cheia. No entanto, para sair do modo tela cheia, você pode tentar fazer algumas alterações no método exitFullScreenMode().

Em vez de definir apenas a flag View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN, você pode tentar adicionar outras flags para garantir que a action bar e a barra de navegação sejam exibidas corretamente após sair do modo tela cheia. Por exemplo, você pode adicionar as flags View.SYSTEM_UI_FLAG_LAYOUT_STABLE, View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION e View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN.

Além disso, verifique se você está mostrando as visualizações corretamente após sair do modo tela cheia. Certifique-se de chamar o método showView() para exibir as visualizações que estavam ocultas durante o modo tela cheia.

Aqui está um exemplo de como você pode modificar o método exitFullScreenMode():

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_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_VISIBLE // Mostrar barra de navegação e status
    );
    windowInsetsControllerCompat.show(WindowInsetsCompat.Type.systemBars());
    windowInsetsControllerCompat.setSystemBarsBehavior(WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_TOUCH);
    //
    FullScreenUtil.showView(activity, viewId);
    //
    decorView.requestLayout();
}

Espero que essas alterações ajudem a resolver o problema que você está enfrentando ao sair do modo tela cheia. Lembre-se de testar o código em diferentes dispositivos e versões do Android para garantir a compatibilidade.

Se ainda tiver alguma dúvida, fique à vontade para perguntar. Estou aqui para ajudar!

Espero ter ajudado e bons estudos!