Подтвердить что ты не робот

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

Я пытаюсь создать 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);
4b9b3361

Ответ 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>