Сделать вывод ящика навигации за панель состояния
Я пытаюсь создать Nav Drawer, как тот, что указан в спецификации Material (например, в новом приложении gmail). Обратите внимание, как содержимое навигационного ящика тянет за панель состояния:
![example from the Material spec]()
Используя ответ Криса Банеса из этого вопроса, я смог успешно сделать ящик навигации в приложении для приложения за панель состояния; это нормально работает. То, что не работает, - это рисование содержимого навигационного ящика за панель состояния. Я хочу, чтобы синее изображение в моем ящике отображалось за строкой состояния, но эта область рисуется цветом строки состояния, как показано на этом снимке экрана.
![my app]()
Итак, как я могу сделать рисование ящика навигации в области за панель состояния? Я разместил соответствующие части моего проекта ниже.
Базовая компоновка, содержащая ящик навигации:
<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);
Ответы
Ответ 1
Я нашел лучший способ сделать это на Android 5.0. Ключ должен использовать ScrimInsetFrameLayout
как корневой элемент навигационного ящика (второй вид в DrawerLayout
). Это приведет к расширению содержимого, чтобы заполнить пробел в строке состояния. Чтобы правильно покрасить вставку, вы можете установить следующий атрибут на ScrimInsetFrameLayout
:
app:insetForeground="#4000"
Кроме того, убедитесь, что у вас есть android:fitsSystemWindows="true"
на макете scrim!
Исходный код для ScrimInsetFrameLayout
можно найти здесь: https://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/widget/ScrimInsetsFrameLayout.java
Ответ 2
Для 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:)
![ss]()
Ответ 3
<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"
), и если вы это сделаете, он не будет затягиваться за панель состояния, а под ним.
Ответ 4
В вашем каталоге "values-v21" добавьте следующие строки:
<style name="AppTheme" parent="BaseTheme">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowSharedElementsUseOverlay">false</item>
</style>
Ответ 5
Просто добавьте эти два значения в свой стиль темы в значениях-v21
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
..
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
</style>
Ответ 6
Для всех, кто борется с полупрозрачным статусом Bar в сочетании с navBar, но не хочет менять <style name="yourAppTheme" parent=
на "android:Theme.Holo.NoActionBar.TranslucentDecor"
, просто добавьте эти строки в свой стиль .xml:
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
<item name="android:windowContentOverlay">@null</item>