Иммерсивный режим — только скрытие строки состояния + повторное скрытие строки состояния через некоторое время без взаимодействия с пользователем

У меня есть активность с двумя панелями инструментов, одна вверху и одна внизу. Я использую инверсный режим, и теперь он работает нормально, он позволяет пользователю перетаскивать строку состояния вниз...

Проблема в том, что строка состояния больше никогда не скрывается после того, как ее перетащили вниз...

Я нашел несколько решений здесь, но я просто не мог заставить его работать. Либо строка состояния отображается поверх моего представления, либо она испортится, если я открою дополнительное меню, либо просто не скроется снова...

Это то, что я использую в настоящее время:

@Override
protected void onResume()
{
    super.onResume();
    enableFullScreenMode();
}

private void enableFullScreenMode()
{
    if (Build.VERSION.SDK_INT < 16)
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    else
        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_FULLSCREEN
//                            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
//                            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
        );
}

Что я хочу

  • всегда в полноэкранном режиме, пока пользователь не перетащит строку состояния вниз
  • через например 3с строка состояния должна снова скрыться, если она не открывалась
  • после закрытия строки состояния она должна снова быть скрыта
  • при открытии моего дополнительного меню на панели инструментов строка состояния НЕ должна отображаться

person prom85    schedule 17.10.2015    source источник
comment
немецкие комментарии...   -  person martyglaubitz    schedule 12.05.2016
comment
Удалил единственный комментарий... Однако придирчивый и непродуктивный комментарий...   -  person prom85    schedule 12.05.2016
comment
честно говоря, я работаю над той же проблемой и опубликую решение, когда найду его;)   -  person martyglaubitz    schedule 12.05.2016
comment
Было бы здорово. В настоящее время я реализовал решение, которое работает, но строка состояния больше не скрывается автоматически (я не знаю, когда она отображается, поэтому я не могу вызвать вызов функции скрытия). Таким образом, он остается видимым до тех пор, пока пользователь снова не щелкнет по экрану... И это нормально.   -  person prom85    schedule 12.05.2016


Ответы (3)


Ответ: режим стикер с эффектом погружения.

Как говорит док:

«Полосы автоматически исчезают через несколько секунд бездействия или как только пользователь прикасается или делает жест в любом месте за пределами системных полос».

private void hideSystemUI() {
    View decorView = getWindow().getDecorView();
    decorView.setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                    | 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
                    | View.SYSTEM_UI_FLAG_FULLSCREEN);
}
person bu2zhouzhu    schedule 04.07.2019

//1. поместите это после клика.

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
        hideSystemUI();
    }
}

private void hideSystemUI() {
    // Enables regular immersive mode.
    // For "lean back" mode, remove SYSTEM_UI_FLAG_IMMERSIVE.
    // Or for "sticky immersive," replace it with SYSTEM_UI_FLAG_IMMERSIVE_STICKY
    View decorView = getWindow().getDecorView();
    decorView.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
                    | View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}

//2.Удалите "android:fitsSystemWindows="true"" везде из вашего макета.

//3.Добавить hideSystemUI() в onResumes, как это (для автоматического скрытия статуса и нижней навигации).

@Override
public void onResume() {
    super.onResume();
    hideSystemUI();
}
person Shobhit Gupta    schedule 06.03.2019

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

View decorView = getWindow().getDecorView();
decorView.setOnSystemUiVisibilityChangeListener
        (new View.OnSystemUiVisibilityChangeListener() {
    @Override
    public void onSystemUiVisibilityChange(int visibility) {
        // Note that system bars will only be "visible" if none of the
        // LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set.
        if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
            // TODO: The system bars are visible. Make any desired
            // adjustments to your UI, such as showing the action bar or
            // other navigational controls.
        } else {
            // TODO: The system bars are NOT visible. Make any desired
            // adjustments to your UI, such as hiding the action bar or
            // other navigational controls.
        }
    }
});
person aheliver    schedule 21.10.2015