11

Я использую шаблон от Android Studio, который использовал AppCompat Toolbar. К сожалению, панель инструментов отбрасывает тень на строку состояния, поэтому она не выглядит правильно. Я также реализую NavigationDrawer, поэтому я не могу просто установить цвет строки состояния.Тень панели инструментов на панели состояния для Lollipop

Вот как это выглядит:

enter image description here

Вот как это должно быть:

enter image description here

activity_main.xml

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/drawer_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true" 
tools:openDrawer="start"> 

<include 
    layout="@layout/app_bar_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

<android.support.design.widget.NavigationView 
    android:id="@+id/nav_view" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    app:headerLayout="@layout/nav_header_main" 
    app:menu="@menu/activity_main_drawer" /> 

</android.support.v4.widget.DrawerLayout> 

app_bar_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true" 
tools:context="hu.pe.thinhhoang.aaosync.MainActivity"> 

<android.support.design.widget.AppBarLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:theme="@style/AppTheme.AppBarOverlay"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary" 
     app:popupTheme="@style/AppTheme.PopupOverlay" /> 

</android.support.design.widget.AppBarLayout> 

<include layout="@layout/content_main" /> 

</android.support.design.widget.CoordinatorLayout> 

styles.xml (V21)

<resources>> 

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

</resources> 
+1

Отправьте свой код здесь –

+0

Спасибо за ваш быстрый ответ. Я редактировал сообщение, чтобы включить код. –

+0

Почему вы не используете вид ниже и настроили его? –

ответ

5

Эта тень является частью windowContentOverlay на APIs ниже Lollipop (на леденец, это @null).

Когда вы работаете с виджетами панели инструментов, панель инструментов больше не является частью декора окон, поэтому тень начинается в верхней части окна над панелью инструментов, а не ниже (так что вы хотите, чтобы windowContentOverlay был @null). Кроме того, вам нужно добавить дополнительный пустой вид под панелью инструментов pre-LOLLIPOP с фоном, установленным на вертикальную теневую растяжку (8dp tall gradient от #20000000 до #00000000 работает лучше всего). На LOLLIPOP вы можете вместо этого использовать set 8dp elevation.

+0

Фактически я снимал снимок экрана с устройства Lollipop ... Я сделал что-то неправильно? –

+0

AppBarLayout - это элемент, который бросает тень на панель состояния. Лучшее решение, которое я могу найти, заключается в том, чтобы удалить AppBarLayout и добавить вручную добавить тень под панель приложения. –

4

Это потому, что:

<item name="android:statusBarColor">@android:color/transparent</item> 

я думаю.

Понял, проверить это:

http://developer.android.com/training/material/theme.html#StatusBar

Чтобы установить пользовательский цвет для строки состояния, используйте android:statusBarColor атрибут при расширении материала темы. По умолчанию android:statusBarColor наследует значение android:colorPrimaryDark.

И вы установили его на transparent.это не лучший способ для этого, что, поскольку Google поместить этот код для вас:

<item name="colorPrimaryDark">@color/colorPrimaryDark</item> 

А также, вместо:

<style name="AppTheme.NoActionBar"> 

Использование этого и добавить родителя и проверить:

<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.Light.NoActionBar"> 
+2

Прозрачный цвет был автогенерирован Android Studio, когда я выбрал макет NavigationDrawer. Без этого строка состояния не прозрачна и может выглядеть странно, когда вы вытаскиваете ящик. –

5

Я пробовал все остальные ответы, и никто не работал. Что фик его добавлял это к AppBarLayout:

app:elevation="0dp" 
+0

Отлично! Этот совет помог, никто другой не помог. – CoolMind

+2

Решает 50% проблемы, так как это удаляет тень также с нижней стороны, где она должна оставаться на самом деле. – Chapz

+1

Удаляет нижнюю тень, поэтому не полезно – Jason

14

Поместите LinearLayout в так:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true" 
tools:context=".ui.activities.MainScreenActivity"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 
    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/AppTheme.AppBarOverlay"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:background="?attr/colorPrimary" 
      app:popupTheme="@style/AppTheme.PopupOverlay" /> 

    </android.support.design.widget.AppBarLayout> 

    <include layout="@layout/content_main_screen" /> 
</LinearLayout> 
</android.support.design.widget.CoordinatorLayout> 
+0

Этот трюк работал для меня! –

+0

'android.support.design.widget.CoordinatorLayout' также работает (если вы хотите добавить несколько элементов, таких как« RelativeLayout », но в то же время получить пространство для панели инструментов справа). –

+0

Работает для меня. Любое объяснение, почему? –

3

Чтобы получить правильное поведение, вам нужно будет удалить

android:fitsSystemWindows="true" 

С android.support.design.widget.CoordinatorLayout

В вашем styles.xml цвет, определенный в colorPrimaryDark будет использоваться для рисования панели уведомлений.

Вам нужно будет иметь styles.xml в папке values-v21 со следующей деталью в ваших стилях:

<item name="android:statusBarColor">@android:color/transparent</item> 

Надеется, что это помогает.

+0

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

+0

Хм это не сработало. Он удалил тень из строки состояния, но теперь цвет строки состояния очень светло-серый (не мой «colorPrimaryDark»). – friederbluemle

Смежные вопросы