Неожиданное поведение «android: windowTranslucentNavigation»

#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Изображение 1
Теперь это не то, чего я ожидал, посмотрите, как строка состояния и панель инструментов объединены вместе.

Но когда я удалил эту строку кода

 <item name="android:windowTranslucentNavigation">true</item>
  

Вот что у меня получилосьИзображение 2
Обратите внимание, что на этот раз панель инструментов и строка состояния не объединены, вместо этого у нас есть строка состояния и панель инструментов под ней.
Я не могу понять, как на изображении 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) мы можем изменить цвет панели навигации, не нарушая пользовательский интерфейс