#android #xml #android-styles
#Android #xml #android-стили
Вопрос:
Я впервые столкнулся с этим странным поведением в моем основном приложении, которое в настоящее время находится в разработке. Для устранения проблемы я создал тестовое приложение. Тестовое приложение имеет только одно действие MainActivity, которое расширяет действие. Тема для этого действия — AppTheme.Панель действий, объявленная в styles.xml
<style name="AppTheme">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="AppTheme.NoActionBar" parent="AppTheme.Base">
<item name="android:statusBarColor">#FFFFFF</item>
<item name="android:windowTranslucentNavigation">true</item>
</style>
<style name="AppTheme.Base" parent="Theme.MaterialComponents.Light.NoActionBar">
<item name="windowNoTitle">true</item>
<item name="windowActionBar">false</item>
</style>
При этом вывод выглядит следующим образом Изображение 1
Теперь это не то, чего я ожидал, посмотрите, как строка состояния и панель инструментов объединены вместе.
Но когда я удалил эту строку кода
<item name="android:windowTranslucentNavigation">true</item>
Вот что у меня получилось
Обратите внимание, что на этот раз панель инструментов и строка состояния не объединены, вместо этого у нас есть строка состояния и панель инструментов под ней.
Я не могу понять, как на изображении 1 макет отображается в строке состояния
Я знаю, что этот вопрос смутит многих из вас, читающих это. Но как можно добавить атрибут
<item name="android:windowTranslucentNavigation">true</item>
это не имеет никакого отношения к строке состояния.
Мое тестовое устройство работает на Android Pie
Ответ №1:
Итак, после небольшого исследования я обнаружил, что
android:windowTranslucentNavigation=true
панель навигации не только становится полупрозрачной, но и позволяет макету рисовать за строкой состояния.
Проблема в том, что если мы хотим иметь цветную панель навигации (для Lollipop и выше) вместо полупрозрачной, нам нужно удалить эту строку, и таким образом мы больше не сможем рисовать за строкой состояния.
Обходной путь:
Объявить styles.xml (v21) и установите цвет панели навигации
<item name="android:navigationBarColor">@color/red</item>
Теперь, поскольку это styles.xml файл будет использоваться только для устройств с API >= 21 нам нужно убедиться, что макет также отображается за строкой состояния для API>= 21 итак, добавьте следующие строки в onCreate вашей активности перед setContentView
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) // Checks the API level of the device
{
getWindow()
.getDecorView();
.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
Заключение:
Для устройств (API < 21) android: windowTranslucentNavigation=true сделает панель навигации полупрозрачной, а макет будет отображаться за строкой состояния, а для устройств (API> = 21) мы можем изменить цвет панели навигации, не нарушая пользовательский интерфейс