How to completely exit from Immersive full screen mode?
Asked Answered
Z

2

19

I would like to implement a button to enable/disable the immersive full screen mode. I'm using those methods but the showSystemUI only shows quickly and hide again...

How to completely exit from immersive mode?

My methods:

// This snippet hides the system bars.
    @SuppressLint("NewApi")
    private void hideSystemUI() {
        try{
            // Set the IMMERSIVE flag.
            // Set the content to appear under the system bars so that the content
            // doesn't resize when the system bars hide and show.
            mDecorView.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);
        }catch(Exception e){
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
        }
    }

    // This snippet shows the system bars. It does this by removing all the flags
    // except for the ones that make the content appear under the system bars.
    @SuppressLint("NewApi")
    private void showSystemUI() {
        try{
            mDecorView.setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
        }catch(Exception e){
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

            mDecorView.setVisibility(View.GONE);
            mDecorView.setVisibility(View.VISIBLE);
            WindowManager.LayoutParams attrs = getWindow().getAttributes();
            attrs.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
            getWindow().setAttributes(attrs);
            mDecorView.setPadding(0, getStatusBarHeight(), 0, 0);
        }
    }

How to make the content appear under the system bars again?

Zawde answered 10/2, 2014 at 0:13 Comment(4)
where you call those methods ?Ringside
In the onClick method of a ToggleButton. If the FullScreenButton isChecked, calls hideSystemUi. If the FullScreenButton is not checked, call the showSystemUI. (Remember, this is only called on click in fullscreenbutton.Zawde
:) share full code so i can test itRingside
The code is only this more two Buttons calling this methods. If you click in Full Screen Mode, you go to immersive full screen, calling the method hideSystemUI. But if you click in Return Full Screen, the method showSystemUI is called but the app don't back to no-full-screen mode...Zawde
A
35

Calling setSystemUiVisibility() with View.SYSTEM_UI_FLAG_VISIBLE clears all flags:

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
Aport answered 1/5, 2014 at 16:35 Comment(0)
G
4

What worked for me is the following:

View decorView = activity.getWindow().getDecorView();
decorView.setSystemUiVisibility(0);

I might be wrong but it seems like calling setSystemUiVisibility with 0 clears the flags which were previously applied.

Gracia answered 3/6, 2019 at 7:46 Comment(1)
You are right! See more about it in documentation here: developer.android.com/training/system-ui/dim#revealGoodkin

© 2022 - 2024 — McMap. All rights reserved.