Цветная панель состояния 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
.