Панель действий наложения, скрытая строкой состояния

#android #android-actionbar #overlay #statusbar

#Android #android-панель действий #наложение #строка состояния

Вопрос:

Я пытаюсь заставить свое приложение переключаться между истинным полноэкранным режимом (без строки состояния, без панели действий) и «обычным режимом» (панель действий и строка состояния). Для этого я настроил панель действий в режиме наложения и разрешаю пользователю включать как панель действий, так и строку состояния:

 getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);     
actionBar.show();
  

.. и выключен:

 getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
actionBar.hide();
  

Это работает нормально, за одним исключением: фактический макет изменяется всякий раз, когда выполняется любое из этих действий. Ну, есть еще один флаг для учета, по-видимому, только для этого, и поэтому я добавляю в свой onCreate() :

 getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
  

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

скрытая панель действий

Я чего-то не хватает? Как я могу заставить панель действий правильно отображаться прямо под строкой состояния?

Комментарии:

1. зачем использовать флаг, когда вы можете просто показать и скрыть его

2. Похоже, не работает. Я пробовал использовать decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN) , но, похоже, он не отличается от метода, описанного выше. Единственный флаг, который влияет на изменение размера FLAG_LAYOUT_NO_LIMITS , и это приводит к обрезке панели действий.

Ответ №1:

После проб и ошибок я нашел решение. Это скрывает как панель действий, так и строку состояния, не вызывая изменения размера изображения.

 private void toggleFullscreen(boolean on) {
    ActionBar actionBar = getActionBar();
    View decorView = getWindow().getDecorView();

    if (on) {
        decorView.setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_FULLSCREEN);
        actionBar.hide();
    }
    else {
        decorView.setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
        actionBar.show();
    }

}