Как полностью выйти из иммерсивного полноэкранного режима?

Я хотел бы реализовать кнопку для включения/отключения иммерсивного полноэкранного режима. Я использую эти методы, но showSystemUI показывает только быстро и снова прячется...

Как полностью выйти из иммерсивного режима?

Мои методы:

// 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);
        }
    }

Как сделать так, чтобы контент снова отображался под системными панелями?


person Felipe Porge Xavier    schedule 10.02.2014    source источник
comment
где вы называете эти методы?   -  person mohammed momn    schedule 10.02.2014
comment
В методе onClick ToggleButton. Если FullScreenButton имеет значение Checked, вызывает hideSystemUi. Если флажок FullScreenButton не установлен, вызовите метод showSystemUI. (Помните, это вызывается только при нажатии кнопки в полноэкранном режиме.   -  person Felipe Porge Xavier    schedule 10.02.2014
comment
:) поделитесь полным кодом, чтобы я мог его протестировать   -  person mohammed momn    schedule 12.02.2014
comment
Код состоит только из двух кнопок, вызывающих эти методы. Если вы нажмете в полноэкранном режиме, вы перейдете в иммерсивный полноэкранный режим, вызвав метод hideSystemUI. Но если вы нажмете «Вернуть в полноэкранный режим», вызовется метод showSystemUI, но приложение не вернется в полноэкранный режим...   -  person Felipe Porge Xavier    schedule 12.02.2014


Ответы (2)


Вызов setSystemUiVisibility() с View.SYSTEM_UI_FLAG_VISIBLE очищает все флаги:

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
person Philipp E.    schedule 01.05.2014

Что сработало для меня, так это следующее:

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

Я могу ошибаться, но похоже, что вызов setSystemUiVisibility с 0 сбрасывает ранее примененные флаги.

person guy.gc    schedule 03.06.2019
comment
Ты прав! Подробнее об этом читайте в документации здесь: developer.android.com/training/system- пользовательский интерфейс/dim#показать - person Lincoln; 06.08.2019