Раскрашивание строки состояния Android в Nav Drawer

В этом приложении, которое я создаю, я добавил в свою активность фрагмент Navigation Drawer. Я использую версию 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 Drawer, но любые новости об обратном были бы замечательными!


comment
R.color.colorPrimaryDark ссылается на значение цвета из XML вашего приложения, а не на атрибут темы android:colorPrimaryDark. Что вы определили @color/colorPrimaryDark как в своих файлах res?   -  person alanv    schedule 26.10.2014
comment
Я определил @color/colorPrimaryDark как шестнадцатеричный цвет, не могу придумать это сразу. Эта часть работает - она ​​правильно окрашивает строку состояния активности (drawerlayout). Меня больше беспокоит ящик для фрагментов. (Я ДЕЙСТВИТЕЛЬНО хотел бы опубликовать несколько скриншотов, но это мой первый пост...)   -  person Andrew    schedule 26.10.2014
comment
DrawerLayout.setStatusBarBackgroundColor() — правильный вызов метода для установки цвета строки состояния ящика. Вам не нужно устанавливать для него специальную тему. Получает ли getResources().getColor(R.color.colorPrimaryDark) белый цвет?   -  person alanv    schedule 26.10.2014
comment
R.color.colorPrimaryDark устанавливается в colors.xml с таким объявлением: ‹color name=colorPrimaryDark›#303f9f‹/color›. Он устанавливает цвет строки состояния для верхнего контейнера в макете действия (activity_main.xml). Что не окрашивается, так это часть строки состояния фрагмента. Я понял, что могу использовать imgur, поэтому вот как это выглядит: imgur.com/5rbKnZb. Справа находится основное содержимое, а слева — фрагмент навигации.   -  person Andrew    schedule 26.10.2014
comment
О, также, это эффект от Google Now, которого я пытаюсь добиться. Опять же, слева находится Nav Drawer, а справа — содержимое. imgur.com/gC4s0YB   -  person Andrew    schedule 26.10.2014


Ответы (1)


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

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


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

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

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

person justasm    schedule 29.10.2014
comment
Спасибо! Я бы проголосовал за ответ, но у меня еще только 3 представителя. - person Andrew; 29.10.2014
comment
Спасибо, я обновил фон корневого представления ящика навигации, и это сработало :) - person Peter; 08.01.2016