Спосіб №1:
Для досягнення абсолютно прозорого рядка стану вам потрібно скористатися statusBarColor
, який доступний лише в API 21 і вище. windowTranslucentStatus
доступний в API 19 і вище, але він додає тонований фон для рядка стану. Однак налаштування windowTranslucentStatus
досягає одного, чого не змінюється statusBarColor
на прозорий: він встановлює SYSTEM_UI_FLAG_LAYOUT_STABLE
і SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
прапори. Найпростіший спосіб отримати той самий ефект - це встановити ці прапори вручну, що ефективно відключає вставки, накладені системою розмітки Android, і залишає вас піклуватися про себе.
Ви називаєте цей рядок у своєму onCreate
методі:
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
Не забудьте також встановити прозорість у /res/values-v21/styles.xml:
<item name="android:statusBarColor">@android:color/transparent</item>
Або встановіть прозорість програмно:
getWindow().setStatusBarColor(Color.TRANSPARENT);
Хорошою стороною цього підходу є те, що ті ж макети та конструкції можна також використовувати на API 19, торгуючи прозорою смугою стану для тонованої напівпрозорої смуги стану.
<item name="android:windowTranslucentStatus">true</item>
Спосіб №2:
Якщо вам потрібно лише намалювати фонове зображення під рядком статусу, а не розміщувати подання за ним, це можна зробити, просто встановивши фон теми вашої діяльності на потрібне зображення та встановивши прозорість рядка стану, як показано у методі № 1. Це був метод, який я використовував для створення скріншотів для статті про поліцію Android від декількох місяців тому.
Спосіб №3:
Якщо вам доведеться ігнорувати стандартні системні вставки для деяких макетів, залишаючи їх працювати в інших, єдиний життєздатний спосіб зробити це - це робота з часто пов'язаним ScrimInsetsFrameLayout
класом. Звичайно, деякі речі, зроблені в цьому класі, потрібні не для всіх сценаріїв. Наприклад, якщо ви не плануєте використовувати накладку синтетичної панелі стану, просто прокоментуйте все в init()
методі і не переймайтеся додаванням нічого у файл attrs.xml. Я бачив, як цей підхід працює, але я думаю, що ви побачите, що він приносить деякі інші наслідки, які, можливо, потребують багато роботи.
Я також бачив, що ви проти переплетення кількох макетів. У разі обгортання одного макета всередині іншого, де обидва мають match_parent
висоту та ширину, наслідки для продуктивності надто тривіальні, щоб турбуватися. Незалежно від цього ви можете повністю уникнути цієї ситуації, змінивши клас, з якого він поширюється, FrameLayout
на будь-який інший тип класу Макет, який вам подобається. Це буде працювати чудово.
android:fitsSystemWindows="true"