Скрыть строку состояния

В этом уроке описано, как скрыть строку состояния в разных версиях Android. Скрытие строки состояния (и, при необходимости, панели навигации) позволяет содержимому использовать больше места на дисплее, тем самым обеспечивая более захватывающий пользовательский опыт.

На рис. 1 показано приложение с видимой строкой состояния:

системные панели

Рисунок 1. Видимая строка состояния.

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

системные панели

Рисунок 2. Скрытая строка состояния.

Скрыть строку состояния на Android 4.0 и более ранних версиях

Вы можете скрыть строку состояния на Android 4.0 (уровень API 14) и ниже, установив флаги WindowManager . Вы можете сделать это программно или установив тему активности в файле манифеста вашего приложения. Установка темы активности в файле манифеста вашего приложения является предпочтительным подходом, если строка состояния всегда должна оставаться скрытой в вашем приложении (хотя, строго говоря, вы можете программно переопределить тему, если захотите). Например:

<application
    ...
    android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" >
    ...
</application>

Преимущества использования темы деятельности заключаются в следующем:

  • Его проще поддерживать и он менее подвержен ошибкам, чем программная установка флага.
  • Это приводит к более плавным переходам пользовательского интерфейса, поскольку система имеет информацию, необходимую для визуализации вашего пользовательского интерфейса, прежде чем создавать экземпляр основного действия вашего приложения.

Альтернативно вы можете программно установить флаги WindowManager . Такой подход упрощает скрытие и отображение строки состояния при взаимодействии пользователя с вашим приложением:

Котлин

class MainActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // If the Android version is lower than Jellybean, use this call to hide
        // the status bar.
        if (Build.VERSION.SDK_INT < 16) {
            window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN)
        }
        setContentView(R.layout.activity_main)
    }
    ...
}

Ява

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // If the Android version is lower than Jellybean, use this call to hide
        // the status bar.
        if (Build.VERSION.SDK_INT < 16) {
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
        }
        setContentView(R.layout.activity_main);
    }
    ...
}

Когда вы устанавливаете флаги WindowManager (с помощью темы действия или программно), они остаются в силе, пока ваше приложение не очистит их.

Вы можете использовать FLAG_LAYOUT_IN_SCREEN чтобы настроить макет активности на использование той же области экрана, которая доступна, когда вы включили FLAG_FULLSCREEN . Это предотвращает изменение размера вашего контента, когда строка состояния скрывается и отображается.

Скрыть строку состояния на Android 4.1 и выше

Вы можете скрыть строку состояния на Android 4.1 (уровень API 16) и выше, используя setSystemUiVisibility() . setSystemUiVisibility() устанавливает флаги пользовательского интерфейса на уровне отдельного представления; эти настройки агрегируются на уровне окна. Использование setSystemUiVisibility() для установки флагов пользовательского интерфейса дает вам более детальный контроль над системными панелями, чем использование флагов WindowManager . Этот фрагмент скрывает строку состояния:

Котлин

// Hide the status bar.
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN
// Remember that you should never show the action bar if the
// status bar is hidden, so hide that too if necessary.
actionBar?.hide()

Ява

View decorView = getWindow().getDecorView();
// Hide the status bar.
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
// Remember that you should never show the action bar if the
// status bar is hidden, so hide that too if necessary.
ActionBar actionBar = getActionBar();
actionBar.hide();

Обратите внимание на следующее:

  • После очистки флагов пользовательского интерфейса (например, путем перехода от действия) вашему приложению необходимо сбросить их, если вы хотите снова скрыть панели. См. раздел «Реакция на изменения видимости пользовательского интерфейса» , где обсуждается, как прослушивать изменения видимости пользовательского интерфейса, чтобы ваше приложение могло реагировать соответствующим образом.
  • То, где вы устанавливаете флаги пользовательского интерфейса, имеет значение. Если вы скроете системные панели в методе onCreate() своей активности и пользователь нажмет «Домой», системные панели появятся снова. Когда пользователь повторно открывает действие, onCreate() не будет вызываться, поэтому системные панели останутся видимыми. Если вы хотите, чтобы изменения пользовательского интерфейса системы сохранялись, когда пользователь входит в вашу деятельность и выходит из нее, установите флаги пользовательского интерфейса в onResume() или onWindowFocusChanged() .
  • Метод setSystemUiVisibility() имеет эффект только в том случае, если представление, из которого вы его вызываете, видимо.
  • Выход из представления приводит к очистке флагов, установленных с помощью setSystemUiVisibility() .

Сделайте контент видимым за строкой состояния

В Android 4.1 и более поздних версиях вы можете настроить отображение содержимого вашего приложения за строкой состояния, чтобы содержимое не меняло размер при скрытии и отображении строки состояния. Для этого используйте SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN . Вам также может потребоваться использовать SYSTEM_UI_FLAG_LAYOUT_STABLE чтобы помочь вашему приложению поддерживать стабильный макет.

Когда вы используете этот подход, вы несете ответственность за то, чтобы критические части пользовательского интерфейса вашего приложения (например, встроенные элементы управления в приложении «Карты») не закрывались системными панелями. Это может сделать ваше приложение непригодным для использования. В большинстве случаев вы можете справиться с этим, добавив атрибут android:fitsSystemWindows в файл макета XML со значением true . Это регулирует заполнение родительской ViewGroup , чтобы оставить место для системных окон. Этого достаточно для большинства приложений.

Однако в некоторых случаях вам может потребоваться изменить отступы по умолчанию, чтобы получить желаемый макет для вашего приложения. Чтобы напрямую управлять расположением вашего контента относительно системных панелей (которые занимают пространство, известное как «вставки контента» окна), переопределите fitSystemWindows(Rect insets) . Метод fitSystemWindows() вызывается иерархией представлений, когда вставки содержимого окна изменились, чтобы позволить окну соответствующим образом настроить свое содержимое. Переопределив этот метод, вы можете обрабатывать вставки (и, следовательно, макет вашего приложения) по своему усмотрению.