#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();
}
}