2015-09-09 9 views
6

Probieren neue Android-Design-Bibliothek Ich habe einen Fehler mit Symbolleiste Schatten. Wenn Sie CollapsingToolbarLayout verwenden, wird die Schattenunterhalb-Symbolleiste nur angezeigt, wenn die Symbolleiste minimiert ist. Wenn wir es erweitern, verschwindet der Schatten. Mein Layout sieht aus wieAndroid-Design-Bibliothek Symbolleiste Schatten

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

<android.support.design.widget.AppBarLayout 
    android:id="@+id/appbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:fitsSystemWindows="true" 
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

    <android.support.design.widget.CollapsingToolbarLayout 
     android:id="@+id/collapsing_toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:fitsSystemWindows="true" 
     app:contentScrim="?attr/colorPrimary" 
     app:layout_scrollFlags="scroll|exitUntilCollapsed"> 

     <ImageView 
      android:layout_width="match_parent" 
      android:layout_height="@dimen/user_avatar_height" 
      android:fitsSystemWindows="true" 
      android:scaleType="centerCrop" 
      app:layout_collapseMode="parallax" /> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:gravity="center_vertical" 
      app:layout_collapseMode="pin" 
      app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> 

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

    <android.support.design.widget.TabLayout 
     android:id="@+id/tabs" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom" 
     android:background="@color/colorPrimary" 
     android:minHeight="?attr/actionBarSize" 
     app:tabGravity="fill" 
     app:tabIndicatorColor="@android:color/white" 
     app:tabMaxWidth="0dp" 
     app:tabMode="fixed" /> 

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

<android.support.v4.view.ViewPager 
    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

und Ergebnisse enter image description here Es ist ein Schatten, wenn Symbolleiste zusammenbrach.

enter image description here

Aber wenn es verschwinden Schatten erweitern.

Gibt es Lösungen, um dieses Problem zu lösen? Kann es eine Möglichkeit geben, mit dem Auftreten/Verschwinden von Schatten umzugehen? Danke.

+0

Es könnte kein Fehler sein - es ist möglich, es soll das Verhalten unter „mit überlappenden Inhalt Flexible Raum“ decribed zu tun, am Ende dieser Seite: https://www.google.com/design /spec/patterns/scrolling-techniques.html#scrolling-techniques-scrolling – JoeyJubb

+0

Haben Sie eine Lösung gefunden? Ich denke, das Verhalten ist beabsichtigt, aber es scheint wie ein großer Aufwand, wenn Sie den Schatten wollen, selbst wenn er erweitert wird. Ich habe versucht, AppBarLayout Offset-Änderungen zu hören und den Schatten manuell einstellen, und auch das AppBarLayout in einem RelativeLayout einwickeln und manuell einen Schatten darunter setzen, aber nichts funktioniert wie ich will ... – Thoast83

+0

@ Thoast83 Eine Antwort unten posten. –

Antwort

0

ich nur CollapsingToolbarLayout Code wie dieser es anstelle von nativem CollapsingToolbarLayout in xml verwenden

public class ShadowCollapsingToolbarLayout extends CollapsingToolbarLayout { 

private AppBarLayout.OnOffsetChangedListener mOnOffsetChangedListener; 

//constructors 

@Override 
protected void onAttachedToWindow() { 
    super.onAttachedToWindow(); 
    ViewParent parent = this.getParent(); 
    if (parent instanceof AppBarLayout) { 
     if (mOnOffsetChangedListener != null) 
      ((AppBarLayout) parent).addOnOffsetChangedListener(mOnOffsetChangedListener); 
    } 
} 

public void setOnOffsetChangeListener(AppBarLayout.OnOffsetChangedListener listener) { 
    mOnOffsetChangedListener = listener; 
} 
} 

außer Kraft setzen und setzen Hörer wie diese

mCollapsingLayout.setOnOffsetChangeListener(new AppBarLayout.OnOffsetChangedListener() { 
      @Override 
      public void onOffsetChanged(AppBarLayout appBarLayout, int i) { 
       ViewCompat.setElevation(appBarLayout, appBarLayout.getTargetElevation()); 
      } 
     }); 
3

aktualisieren

Es scheint, dass die Unterstützung Bibliotheksteam von Google führte das Verhalten als Teil von 24.0.0 ein, aber es war irgendwie fehlerhaft Jetzt gibt es eine neue Problemumgehung, die Sie tun müssen.

1 - Erstellen Sie appbar_always_elevated.xml im Ordner animator-v21 im Verzeichnis res.

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item> 
     <objectAnimator android:propertyName="elevation" 
         android:valueTo="8dp" 
         android:valueType="floatType" 
         android:duration="1"/> 
    </item> 

</selector> 

2 - In AppBarLayout verwenden:

<android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="300dp" 
     android:fitsSystemWindows="true" 
     android:stateListAnimator="@animator/appbar_always_elevated" 
     android:theme="@style/AppTheme.AppBarOverlay"> 

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

Alte Antwort

Sie setzten diese als Teil der neuen Support-Bibliothek Version (24), so dass Sie brauchen nur zu Aktualisieren Sie und verwenden Sie die richtige Eigenschaft.

Uhr https://youtu.be/w45y_w4skKs?t=31m52s

enter image description here


Alte Antwort

ich dieses Problem gelöst, indem ein FrameLayout der ViewPager um mit und android:foreground Einstellung.

Beigefügt ist die ziehbar, die ich verwende, und hier ist der Link zum gist

enter image description here

1

Die Antwort von @ amilcar-andrade mir geholfen, die richtige Lösung zu finden, da seine Verbindung nicht korrekt ist .

Sie haben die stateListAnimator auf Ihre AppBarLayout anzuwenden:

Beispiel:

<android.support.design.widget.AppBarLayout 
    android:id="@+id/appbar" 
    android:layout_width="match_parent" 
    android:layout_height="320dp" 
    android:stateListAnimator="@animator/appbar_always_elevated" 
    android:fitsSystemWindows="true"> 

und diese xml als Animator verwenden:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
     <objectAnimator android:propertyName="elevation" 
      android:valueTo="8dp" 
      android:valueType="floatType" 
      android:duration="1"/> 
    </item> 
</selector> 
0

In meinem Fall war dieser Code für mich !

<android.support.design.widget.AppBarLayout 
    android:id="@+id/appbar_layout" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:stateListAnimator="@null" 
    android:elevation="4dp">