Цвет строки состояния остается бесцветным, когда для полупрозрачного состояния установлено значение true

Во-первых, хочу отметить, что существует огромное количество вопросов с разным качеством ответов и на самом деле я не могу найти внятного объяснения, аргументации и решения проблемы.

Я хочу:

  1. Тема с windowTranslucentStatus=true
  2. Иногда «рисовать» под строкой состояния (например, DrawerLayout)
  3. Иногда "не рисовать" под строкой состояния и пусть "компоненты/система" рисует colorPrimaryDark вместо меня. (и, возможно, android:fitsSystemWindows="true")

Из разных ресурсов я понял, что есть разница между корневыми макетами, поэтому все мои испытания выполняются с CoordinatorLayout, который кажется наиболее подходящим и готовым к этому. (Непосредственно из библиотеки поддержки, включенной во все примеры с панелями инструментов, макетами панелей приложений и т. д.)

Моя текущая установка:

скомпилировать API 27, поддерживает библиотеки версии 27 *

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context=".MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay"/>

    </android.support.design.widget.AppBarLayout>

    <fragment
        android:id="@+id/fragment"
        android:name="com.sygic.travel.materialtest5.MainActivityFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

</android.support.design.widget.CoordinatorLayout>

значения/styles.xml:

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
    <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"/>
    <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light"/>
</resources>

values-v21/styles.xml:

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:windowTranslucentStatus">true</item>
        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
        <item name="android:statusBarColor">@color/colorPrimaryDark</item>
    </style>
</resources>

Что приводит к:

панель инструментов со строкой состояния без цвета


Вопросы:

  1. Возможно ли вообще использовать windowTranslucentStatus и fitsSystemWindows и не иметь "бело-серой" строки состояния?
  2. Кажется, есть некоторая поддержка для рисования цвета строки состояния в CoordinateLayout, когда fitsSystemWindows, но (внутреннее) свойство (для обработки этого) остается нулевым, как это исправить? Или это только для ручной настройки цвета строки состояния?
  3. В каком случае учитывается опция стиля android:statusBarColor? Какой компонент использует это значение? Почему CoordinateLayout не выбирает эту конфигурацию (с ее основным цветом по умолчанию) и не использует ее?
  4. Какие-либо другие макеты как-то поддерживаются? (Относительные, линейные, ограничения) Действительно ли они рекомендуются в качестве корневых макетов, когда у них есть эти (упомянутые) недостатки?

Примечания:


person hrach    schedule 28.03.2018    source источник


Ответы (1)


Хорошо, я попытался проверить код и нашел это решение! :ура:

Сначала несколько ответов на мои вопросы:

  1. Да, это. Приложение (просмотры) несет ответственность за то, чтобы что-то нарисовать. DrawerLayout делает это автоматически, CoordinatorLayout тоже может, см. далее.
  2. Существует свойство app:statusBarBackground, которое можно установить непосредственно в теге xml в стилях!
  3. Извините, я не знаю (пока! :))
  4. При быстром просмотре кода не кажется, что есть какая-либо поддержка рисования строки состояния.

Таким образом, решение состоит в том, чтобы использовать свойства CoordinatorLayout и statusBarBackground:

values-v21/styles.xml

<resources>
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@color/colorPrimaryDark</item>
    <item name="statusBarBackground">@color/colorPrimary</item>
</resources>
person hrach    schedule 05.04.2018