Спосіб №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"