Цветная панель состояния Android в ящике Nav

В этом приложении, которое я создаю, я добавил фрагмент навигационного ящика в свою деятельность. Я использую 5.0, поэтому я смог установить для primaryColor и primaryColorDark правильные цвета. Я решил попробовать и стилизовать свой Nav Drawer, чтобы он был очень похож на ящик Google Now в 5.0, где Nav Drawer имеет собственный фон для строки состояния. (Не удается опубликовать изображения, недостаточно репутации > . > )

Я следил за этими рекомендациями здесь, что помогло совсем немного. Когда я вытащил его, я достиг чертежа Nav Drawer в строке состояния. Только проблема в том, что я не могу понять, как установить цвет строки состояния, которая отображается в моем ящике. В настоящее время он просто показывает белый цвет.

Вот соответствующие биты моих стилей и кода:

Макет действий:

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Main"
    android:fitsSystemWindows="true">

    <!-- main content -->
    ...

    <!-- Drawer fragment -->
    <fragment
        android:id="@+id/navigation_drawer"
        android:layout_width="@dimen/navigation_drawer_width"
        android:layout_height="match_parent"
        android:layout_gravity="left|start"
        android:theme="@style/DrawerTheme"
        android:fitsSystemWindows="true"
        android:choiceMode="singleChoice"
        android:name="com.myname.appname.NavigationDrawerFragment"
        tools:layout="@layout/fragment_navigation_drawer" />

</android.support.v4.widget.DrawerLayout>

Макет фрагмента:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/navDrawerFragment"
    android:theme="@style/DrawerTheme"
    android:background="@color/WindowBackground"
    tools:context=".NavigationDrawerFragment"
    android:fitsSystemWindows="true">

     <!-- content here -->

</RelativeLayout>

На приведенную выше ссылку, задающую цвет моей строки состояния для активности (эта часть работает правильно):

public void onCreate(Bundled savedInstanceState) {
    super.onCreate(savedInstanceState);

    // ....

    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawerLayout.setDrawerShadow(R.drawable.drawer_shadow, Gravity.START);
    drawerLayout.setStatusBarBackgroundColor(getResources().getColor(R.color.colorPrimaryDark));

    // ....
}

И, наконец, мои связанные стили для активности и то, что я "пытался" назначить фрагменту.

<style name="StatusBarActivityTheme" parent="MyAppTheme">
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>


<style name="DrawerTheme" parent="MyAppTheme">
    <item name="android:statusBarColor">#000000</item>
    <item name="android:colorPrimaryDark">#000000</item>
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
</style>

Заранее благодарим за любую помощь, которую вы можете отправить мне! Я подозреваю, что моя проблема связана с тем, как основной экран Google Now имеет прозрачную строку состояния и только окрашивает его во время ящика Nav, но любые новости об обратном были бы замечательными!

Ответ 1

При установленной настройке Nav Drawer представляет собой просто рисунок, в котором его фон (который вы определили как android:background="@color/WindowBackground") находится под строкой состояния (цвет, который вы установили на прозрачность с помощью StatusBarActivityTheme). Система только просматривает тему активности, чтобы установить цвет строки состояния; присвоение android:statusBarColor ребенку не имеет эффекта.

Простым решением будет изменить макет фрагмента Nav Drawer android:background на желаемый цвет. Если вы хотите, чтобы часть, расположенная ниже вашего изображения, оставалась белой, тогда вам нужно было бы добавить пустой вид в макет вашего ящика с помощью android:background="@color/WindowBackground" или другого цвета.


Если вы хотите, чтобы содержимое вашего навигационного ящика расширялось ниже строки состояния, для этого требуется немного больше работы. Причина, по которой это смещение начинается, заключается в том, что для атрибута android:fitsSystemWindows установлено значение true, которое, в свою очередь, вызывает представление по умолчанию fitSystemWindows(). Как объясняет docs, этот метод берет вставку (то есть высоту строки состояния в нашем случае) и применяет ее как дополнение к представлению (в вашем случае это становится верхней частью для RelativeLayout вашего фрагмента Nav Drawer).

Один из способов обойти это дополнение - перезаписать метод просмотра fitSystemWindows(). Я направляю вас в приложение Google Schedule с открытым исходным кодом для Google - в частности, они использовали ScrimInsetsScrollView в качестве корневого элемента в Ящик навигации. Этот измененный ScrollView применяет холст цвета по вашему выбору (устанавливается через пользовательский атрибут app:insetForeground) и потребляет вставку, т.е. Больше не заполняется!

ScrimInsetsScrollView можно использовать в качестве модели для написания вашей собственной версии для любого вида потомка, действительно - см. почти идентичный ScrimInsetsFrameLayout.