Android Draw за строкой состояния, но не за панелью навигации

Я ищу способ, при котором строка состояния будет полностью прозрачной, а не полупрозрачной, а панель навигации останется нетронутой.

Самое близкое, что я могу получить, это использовать флаг

WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS

но это также отстает от панели навигации.

Фон — это то, что делает это сложным, это тонкий градиент, и когда я устанавливаю цвет строки состояния в начало градиента, он выглядит почти правильно, но имеет тонкую линию в верхней части экрана.

Есть ли хороший способ разместить активность в окне, только вверху, но если внизу есть панель навигации, оставьте ее в покое?


person DR Haus    schedule 26.10.2015    source источник


Ответы (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>

Я предполагаю, что вы пробовали это или что-то подобное. Если это не работает, убедитесь, что корневым элементом является FrameLayout.

person Ben Kane    schedule 26.10.2015
comment
По умолчанию используется android.support.design.widget.CoordinatorLayout вместо Frame Layout. Это помогло, спасибо - person DR Haus; 26.10.2015