Сделать вывод ящика навигации за панель состояния

Я пытаюсь создать Nav Drawer, как тот, который имеет спецификацию Material (например, тот из нового приложения gmail). Обратите внимание на то, как содержимое навигационного ящика тянет за панель состояния:

Пример из спецификации Material

Используя ответ Криса Банеса из этого вопроса , я смог успешно сделать навигационный ящик в приложении, за которым стоит строка состояния; Это нормально работает. То, что не работает, – это рисование содержимого навигационного ящика за панель состояния. Я хочу, чтобы синее изображение в моем ящике отображалось за панель состояния, но эта область рисуется цветом строки состояния, как показано на этом снимке экрана.

Мое приложение

Итак, как я могу сделать рисование ящика навигации в области за панель состояния? Я разместил соответствующие части моего проекта ниже.

Базовая компоновка, содержащая ящик для навигации:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/nav_drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:fitsSystemWindows="true"> <!-- Framelayout to display Fragments --> <FrameLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/warning_container" /> <FrameLayout android:id="@+id/navigation_drawer_fragment_container" android:layout_width="300dp" android:layout_height="match_parent" android:fitsSystemWindows="true" android:layout_gravity="start"> <fragment android:id="@+id/navigation_drawer_fragment" android:name="com.thebluealliance.androidclient.fragments.NavigationDrawerFragment" android:layout_width="match_parent" android:layout_height="match_parent" tools:layout="@layout/fragment_navigation_drawer" /> </FrameLayout> </android.support.v4.widget.DrawerLayout> 

Тема моей деятельности

 <style name="AppThemeNoActionBar" parent="AppTheme"> <item name="windowActionBar">false</item> <item name="android:windowNoTitle">true</item> <item name="android:windowDrawsSystemBarBackgrounds">true</item> <item name="android:statusBarColor">@android:color/transparent</item> </style> 

В onCreate() моей активности я делаю следующее:

 mDrawerLayout.setStatusBarBackground(R.color.primary_dark); 

Solutions Collecting From Web of "Сделать вывод ящика навигации за панель состояния"

Для API 21+

 <style name="AppTheme" parent="android:Theme.Holo.NoActionBar.TranslucentDecor"> ... </style> 

Для API 19+

 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="android:windowTranslucentStatus">true</item> </style> 

В вашем макете должен быть android:fitsSystemWindows="false" (по умолчанию).


Теперь, поскольку вы хотите переключить прозрачность, вы можете сделать это программно:

 Window window = getWindow(); // Enable status bar translucency (requires API 19) window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); // Disable status bar translucency (requires API 19) window.getAttributes().flags &= (~WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); // Set a color (requires API 21) window.setStatusBarColor(Color.RED); 

Я оставляю все проверки версии sdk вам 🙂


сс

 <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"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:fitsSystemWindows="true"> <include layout="@layout/toolbar" /> <!-- Main layout --> <FrameLayout android:id="@+id/main_fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> <!-- Nav drawer --> <fragment android:id="@+id/fragment_drawer" android:name="com.example.DrawerFragment" android:layout_width="@dimen/drawer_width" android:layout_height="match_parent" android:layout_gravity="left|start" android:fitsSystemWindows="true" /> </android.support.v4.widget.DrawerLayout> 

Значения / themes.xml

 <style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowBackground">@color/primary</item> <item name="colorPrimary">@color/primary</item> <item name="colorPrimaryDark">@color/primaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="android:textColorPrimary">@color/textColorPrimary</item> </style> <style name="AppTheme" parent="AppTheme.Base"> </style> 

Значения-V19 / themes.xml

 <style name="AppTheme" parent="AppTheme.Base"> <!--This makes the status bar transparent in KK and Lollipop--> <!--You do not need values-v21 and if you create them make sure you extend from this one--> <item name="android:windowTranslucentStatus">true</item> </style> 

Если вы хотите изменить цвет (отличный от прозрачного черного) строки состояния, вам нужно будет перейти к другому подходу с пользовательским представлением, потому что mDrawerLayout.setStatusBarBackgroundColor(int) будет активирован, только если этот DrawerLayout fitsSystemWindows ( android:fitsSystemWindows="true" ), и если вы это сделаете, он не будет затягиваться за панель состояния, а под ним.

Я нашел лучший способ сделать это на Android 5.0. Ключ должен использовать ScrimInsetFrameLayout в качестве корневого элемента навигационного ящика (второй вид в DrawerLayout ). Это позволит расширить содержимое, чтобы заполнить пробел по строке состояния. Чтобы правильно покрасить вставку, вы можете установить следующий атрибут на ScrimInsetFrameLayout :

 app:insetForeground="#4000" 

Кроме того, убедитесь, что у вас есть android:fitsSystemWindows="true" на макете android:fitsSystemWindows="true" !

Исходный код ScrimInsetFrameLayout можно найти здесь: https://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/widget/ScrimInsetsFrameLayout .Ява

В вашем каталоге «values-v21» добавьте следующие строки:

 <style name="AppTheme" parent="BaseTheme"> <item name="android:windowTranslucentStatus">true</item> <item name="android:windowSharedElementsUseOverlay">false</item> </style> 

Просто добавьте эти два значения в свой стиль темы в значениях-v21

 <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> .. <item name="android:statusBarColor">@android:color/transparent</item> <item name="android:windowDrawsSystemBarBackgrounds">true</item> </style> 

Для всех, кто борется с полупрозрачным статусом Bar в сочетании с navBar, но не хочет изменять <style name="yourAppTheme" parent= to "android:Theme.Holo.NoActionBar.TranslucentDecor" , просто добавьте эти строки в свой стиль.xml:

  <item name="android:windowTranslucentStatus">true</item> <item name="android:windowTranslucentNavigation">true</item> <item name="android:windowContentOverlay">@null</item>