2015-01-27 12 views
7

Ich benutze die Symbolleiste von AppCompat V7, um die vorherige Aktionsleiste zu ersetzen und den Schatten der Symbolleiste wie die vorherige Aktionsleiste zu haben. aber die Symbolleiste hat standardmäßig keinen Schatten und ich habe die Fixes aus reddit versucht. aber ohne Glück.Material Design - AppCompat Symbolleiste ohne Schatten zu zeigen

der Code den Schatten zu setzen:

mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); 

Die Symbolleiste Layout:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" 
    android:minHeight="?attr/actionBarSize" 
    android:background="#F1F1F1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:padding="0dp" 
    android:layout_margin="0dp" 
    foreground="?android:windowContentOverlay"> 

die Aktivität Layout:

<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools"  
    tools:context=".MainActivity" 
    android:layout_width="match_parent" 
    android:id="@+id/drawer_layout" 
    android:layout_height="match_parent"> 

    <!-- activity view --> 
    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <include 
      android:id="@+id/toolbar" 
      layout="@layout/toolbar" /> 
     <FrameLayout android:id="@+id/fragment_container" 
      android:layout_below="@id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      /> 

    </RelativeLayout> 

    <!-- navigation drawer --> 
    <RelativeLayout 
     android:id="@+id/left_drawer" 
     android:layout_gravity="start" 
     android:layout_width="match_parent" 
     android:background="#fff" 
     android:layout_height="match_parent"> 

     <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:paddingLeft="16dp" 
      android:paddingRight="16dp" 
      android:paddingTop="8dp" 
      android:paddingBottom="8dp" 
      android:divider="#eee" 
      android:background="#EEE" 
      android:id="@+id/drawer_header"> 
      <ImageView 
       android:id="@+id/user_icon" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="top" 
       android:layout_alignParentTop="true" 
       android:layout_alignParentLeft="true" 
       android:contentDescription="@string/user_icon" 
       android:src="@drawable/ic_action_person" 
       android:paddingTop="0dp" 
       android:paddingLeft="0dp"/> 
      <TextView 
        android:id="@+id/userName" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_toRightOf="@+id/user_icon" 
        android:gravity="center" 
        android:layout_gravity="center_vertical" 
        android:layout_centerVertical="true" 
        android:textSize="14sp" 
        android:text="@string/not_logged_in" 
        android:paddingTop="0dp" 
        android:paddingBottom="0dp"/> 
     </RelativeLayout> 
     <ListView 
      android:id="@+id/drawer_list" 
      android:layout_below="@+id/drawer_header" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:divider="#eee" 
      android:background="#fff" 
      android:dividerHeight="0dp" /> 
    </RelativeLayout> 

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

Einstellung im style.xml:

<style name="myAppTheme" parent="Theme.AppCompat.Light"> 
    <item name="colorPrimary">@color/primaryColor</item> 
    <item name="colorPrimaryDark">@color/primaryColorDark</item> 
    <item name="android:windowNoTitle">true</item> 
    <item name="windowActionBar">false</item> 
    <item name="drawerArrowStyle">@style/DrawerArrowStyle</item> 
    <item name="android:windowContentOverlay">@drawable/drawer_shadow</item> 
</style> 

<style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle"> 
    <item name="spinBars">true</item> 
    <item name="color">@android:color/black</item> 
</style> 

Kann jemand helfen?

danke!

Update 1: mit dem Vorschlag von Willis, ich bekomme den Schatten angezeigt, aber es ist nicht unter der Symbolleiste, sondern es ist auf der linken Seite der Symbolleiste.

Update 2: Ich habe festgestellt, dass, wenn ich nicht windowContentOverlay in toolbar.xml und styles.xml festlegen, der Schatten tatsächlich auf der Oberseite der Symbolleiste ist.

+0

Die beiden sind ganz andere Schatten. Die vertikale ist die von 'DrawerLayout'. Es soll neben erweiterter Schublade angezeigt werden. Die horizontale Komponente ist Teil von 'windowContentOverlay' auf APIs unter' LOLLIPOP'. Wenn Sie mit dem 'Toolbar'-Widget arbeiten, ist die Symbolleiste nicht Teil der Fensterdekoration, daher beginnt der Schatten oben im Fenster über der Symbolleiste statt darunter. Sie müssen eine zusätzliche leere "Ansicht" unterhalb der "Symbolleiste" vor "LOLLIPOP" hinzufügen, wobei der Hintergrund auf einen vertikalen Schatten (8 dp groß '# 20000000' bis' # 00000000') eingestellt ist. Auf 'LOLLIPOP' können Sie eine 8dp Höhe in der Werkzeugleiste einstellen. –

+0

Hallo Eugen, du hast mir den Tag gerettet. Das ist genau das, was ich brauche, und es funktioniert großartig unter Pre-Lollipop. Das sollte die richtige Antwort sein. Kannst du es als Antwort posten und ich kann das akzeptieren. Danke vielmals! –

+0

Ich tat es nur, froh, dass ich Ihnen behilflich sein konnte. –

Antwort

4

Diese beiden sind völlig unterschiedliche Schatten. Die vertikale ist die DrawerLayout. Es soll neben erweiterter Schublade angezeigt werden. Der horizontale ist ein Teil von windowContentOverlay auf APIs unter LOLLIPOP (auf LOLLIPOP ist es @null).

Wenn Sie mit Toolbar Widget arbeiten, ist die Symbolleiste nicht mehr Teil der Fensterdekoration nicht so der Schatten am oberen Rand des Fensters beginnt über die Symbolleiste statt unter es (so dass Sie wollen die windowContentOverlay@null sein). Darüber hinaus müssen Sie einen zusätzlichen leeren View unter der Symbolleiste vor LOLLIPOP mit seinem Hintergrund auf einen vertikalen Schatten zeichnen (8DP hohen Gradienten von #20000000 bis #00000000 funktioniert am besten) hinzufügen. Unter LOLLIPOP können Sie stattdessen eine 8-fache Höhe in der Symbolleiste festlegen.

Hinweis: Verwenden Sie den gleichen Farbverlauf, aber horizontal wie der Schubladenschatten für beste Ergebnisse.

2

Sie können die Menge an Schatten mit der Methode setElevation festlegen. Zum Beispiel:

getSupportActionBar().setElevation(25); 

Vergrößern/Verkleinern des zu setElevation gebene Wert wird folglich die Anwesenheit des Schatteneffektes erhöhen/verringern.

+0

Dank Willis, es gibt einige Verwirrung in meiner Frage, eigentlich muss ich den Schatten zeigen, aber ich habe nicht die Lösung gefunden, damit es funktioniert. Ist es möglich, einen anderen Wert für die Höhe zu setzen, um den Schatten zu zeigen? –

+0

Sorry, ich habe die Frage falsch gelesen. Ich habe meine Antwort bearbeitet. – Willis

+0

Hallo Willis, vielen Dank! Ich habe auch das Thema für die App festgelegt. Ich habe den Schatten jetzt angezeigt, aber es ist nicht unter der Symbolleiste. irgendeinen weiteren Vorschlag? –

0

Um Schatten unter Ihrer Symbolleiste anzuzeigen, verwenden Sie bitte AppBarLayout, das in der Google Design Support-Bibliothek für Android verfügbar ist.Hier ist ein Beispiel, wie es verwendet werden sollte.

<android.support.design.widget.AppBarLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 
    <android.support.v7.widget.Toolbar 
      android:layout_height="?attr/actionBarSize" 
      android:layout_width="match_parent"/> 
    </android.support.design.widget.AppBarLayout> 

Um Google Android Design Support-Bibliothek folgende in Ihre build.gradle Datei eingeben zu verwenden:

compile 'com.android.support:design:22.2.0' 
Verwandte Themen