Иммерсивный режим, показывающий пустое пространство

Я пытаюсь реализовать полноэкранный режим, но для Android 4.4 и выше он показывает пустое место:

ДО иммерсивного режима (полноэкранный режим)

введите описание изображения здесь

и ПОСЛЕ toggleFullScreen(false);

введите описание изображения здесь

как видите, он не удаляет его. Вот код, который я использую для его переключения:

public void toggleFullscreen(boolean fs) {
        if (Build.VERSION.SDK_INT >= 11) {
            // The UI options currently enabled are represented by a bitfield.
            // getSystemUiVisibility() gives us that bitfield.
            int uiOptions = this.getWindow().getDecorView().getSystemUiVisibility();
            int newUiOptions = uiOptions;
            boolean isImmersiveModeEnabled =
                    ((uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) == uiOptions);
            if (isImmersiveModeEnabled) {
                Log.i(getPackageName(), "Turning immersive mode mode off. ");
            } else {
                Log.i(getPackageName(), "Turning immersive mode mode on.");
            }

            // Navigation bar hiding:  Backwards compatible to ICS.
            if (Build.VERSION.SDK_INT >= 14) {
                newUiOptions ^= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
            }

            // Status bar hiding: Backwards compatible to Jellybean
            if (Build.VERSION.SDK_INT >= 16) {
                newUiOptions ^= View.SYSTEM_UI_FLAG_FULLSCREEN;
            }

            // Immersive mode: Backward compatible to KitKat.
            // Note that this flag doesn't do anything by itself, it only augments the behavior
            // of HIDE_NAVIGATION and FLAG_FULLSCREEN.  For the purposes of this sample
            // all three flags are being toggled together.
            // Note that there are two immersive mode UI flags, one of which is referred to as "sticky".
            // Sticky immersive mode differs in that it makes the navigation and status bars
            // semi-transparent, and the UI flag does not get cleared when the user interacts with
            // the screen.
            if (Build.VERSION.SDK_INT >= 18) {
                newUiOptions ^= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
            }
            getWindow().getDecorView().setSystemUiVisibility(newUiOptions);
        } else {
            // for android pre 11
            WindowManager.LayoutParams attrs = getWindow().getAttributes();
            if (fs) {
                attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
            } else {
                attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;
            }
            this.getWindow().setAttributes(attrs);
        }

        try {
            // hide actionbar
            if
                    (this instanceof AppCompatActivity) {
                if (fs) getSupportActionBar().hide();
                else getSupportActionBar().show();
            } else if
                    (Build.VERSION.SDK_INT >= 11) {
                if (fs) getActionBar().hide();
                else getActionBar().show();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

person user2582318    schedule 22.12.2015    source источник
comment
вы нашли решение для этого. Я сталкиваюсь с той же проблемой   -  person glo    schedule 01.06.2016
comment
@glo приведенное ниже решение работает для меня. проверьте этот код   -  person Ankit Aggarwal    schedule 01.06.2016
comment
@glo это происходит только в Android L и выше или также в более низких версиях? Если да, то это происходит только со статусом или с нижней панелью навигации?   -  person Ankit Aggarwal    schedule 03.06.2016


Ответы (5)


Убедитесь, что в макете нет android:fitsSystemWindows="true".

По крайней мере, это решило мой случай - у меня было fitsSystemWindows на FrameLayout.

person Boris Treukhov    schedule 07.06.2016
comment
Но я не использовал его, но все же я получаю эту ошибку, и на самом деле я не понимаю, почему я получаю эту проблему. - person Peter; 20.03.2018
comment
Мой Бог! Я думал, что эта строка должна решить эту проблему. Также кажется, что он был добавлен в макет ящика по умолчанию. Его удаление решило проблему. Спасибо - person Mike Keskinov; 29.06.2020

Я новичок здесь, поэтому я не могу комментировать, но хотел добавить что-то, что меня так расстроило из-за вышеупомянутого решения. Я продолжал проверять свои действия и их фрагменты на наличие android:fitsSystemWindows="true", и его там определенно не было, но у меня постоянно оставался пробел внизу! Я сходил с ума! Не может быть так сложно исправить эту простую вещь!

Оказывается, он также появился в навигационном ящике, который я добавил... так что не забудьте проверить весь свой XML!

person Jacky Tang    schedule 20.07.2017

Попробуй это:

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    var viewParent = view
    while (viewParent is View) {
        viewParent.fitsSystemWindows = false
        viewParent.setOnApplyWindowInsetsListener { _, insets -> insets }
        viewParent = viewParent.parent as View?
    }
}

Что это делает? DialogFragment#onActivityCreated() вызывает Dialog#setContentView(), который упаковывает представление Dialog в закрытый 'wrapInBottomSheet'. Чтобы установить правильные флаги этих представлений-оболочек, мы хотим установить флаги после их обертывания, например. после super.onActivityCreated()

Также посмотрите это выступление, чтобы узнать о fitsSystemWindows и вставках окон.

person cliveleehere    schedule 11.07.2019

Просто измените android:fitsSystemWindows="true" на android:fitsSystemWindows="false" в файле макета.

person Pratik Sharma    schedule 01.12.2019

Вам нужно добавить этот флаг в представление View.SYSTEM_UI_FLAG_LAYOUT_STABLE. Попробуйте это так

// This snippet hides the system bars.
private void hideSystemUI() {
// 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);
}

// 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.
private void showSystemUI() {
mDecorView.setSystemUiVisibility(
        View.SYSTEM_UI_FLAG_LAYOUT_STABLE
        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
person android_Muncher    schedule 29.12.2015
comment
привет @android_Muncher, это не решило, =(, я использую Fragment, но вызываю togglefullscreen из Activity, по-прежнему показывает серое пространство, где были программные кнопки, и черное пространство, где была панель уведомлений - person user2582318; 29.12.2015
comment
mDecorView из примера, которым я поделился, должен быть вашим представлением, которое должно быть полноэкранным. Неважно, фрагмент это или активность. Вы можете получить текущее представление, используя этот залоговый код. окончательный вид decorView = getWindow().getDecorView(); - person android_Muncher; 29.12.2015
comment
такая же проблема, не могли бы вы помочь? - person Abhishek Tomar; 11.10.2018