9

Ich versuche, ein layout_behavior auf ein Element, das ein Kind der CollapsingToolbarLayout ist, aber das Verhalten wird nie auf der iv_header Ansicht aufgerufen. Es funktioniert perfekt, wenn es draußen verankert ist, wie zum Beispiel mit der tv_follow Ansicht.Android-Layout Verhalten wird nicht aufgerufen, wenn Kind von CollapsingToolbarLayout

Die Dokumentation sagt nicht speziell eine layout_behavior kann nicht innerhalb der AppBarLayout oder CollapsingToolbarLayout angewendet werden, so dass ich nicht weiß, warum es nicht funktioniert.

<?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" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/header" 
     android:layout_width="match_parent" 
     android:layout_height="@dimen/full_header_height" 
     android:focusable="true" 
     android:focusableInTouchMode="true"> 

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

      <ImageView 
       android:id="@+id/iv_header" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:scaleType="centerCrop" 
       android:contentDescription="@null" 
       app:layout_behavior="com.package.view.HidingBehavior" 
       app:layout_collapseMode="parallax" 
       android:src="@drawable/profile_background"/> 

      <android.support.v7.widget.Toolbar 
       android:id="@+id/header_toolbar" 
       android:layout_height="@dimen/action_bar_height" 
       android:layout_width="match_parent" 
       android:background="@drawable/toolbar_dark_gradient_half" 
       android:gravity="top" 
       app:layout_collapseMode="pin"/> 

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

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

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

    <TextView 
     android:id="@+id/tv_follow" 
     android:textSize="20sp" 
     android:textColor="@android:color/white" 
     android:text="@string/follow" 
     android:drawableLeft="@drawable/comm_follow" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     app:layout_anchor="@id/header" 
     app:layout_anchorGravity="center" 
     app:layout_behavior="com.package.view.HidingBehavior" 
     android:drawablePadding="8dp" 
     android:gravity="center" 
     android:visibility="gone" 
     android:fitsSystemWindows="true"/> 

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

Das Verhalten wurde aus dem FloatingActionButton-Code in der Design-Support-Bibliothek entfernt.

public class HidingBehavior extends CoordinatorLayout.Behavior<View>{ 
    private Rect tmpRect; 
    private boolean isAnimatingOut; 
    private FastOutSlowInInterpolator fastOutSlowInInterpolator = new FastOutSlowInInterpolator(); 

    public HidingBehavior() { 
    } 

    public HidingBehavior(Context context, AttributeSet attrs) { 
     super(); 
    } 

    @Override 
    public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) { 
     return dependency instanceof AppBarLayout; 
    } 

    @Override 
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) { 
     if (dependency instanceof AppBarLayout) { 
      AppBarLayout appBarLayout = (AppBarLayout) dependency; 
      if (this.tmpRect == null) { 
       this.tmpRect = new Rect(); 
      } 

      Rect rect = this.tmpRect; 
      ViewGroupUtils.getDescendantRect(parent, dependency, rect); 
      if (rect.bottom <= getMinimumHeightForContext(appBarLayout)) { 
       if(!this.isAnimatingOut && child.getVisibility() == View.VISIBLE) { 
        this.animateOut(child); 
       } 
      } else if(child.getVisibility() != View.VISIBLE) { 
       this.animateIn(child); 
      } 
     } 

     return false; 
    } 

    private int getMinimumHeightForContext(AppBarLayout appBarLayout) { 
     int minHeight = ViewCompat.getMinimumHeight(appBarLayout); 
     if(minHeight != 0) { 
      return minHeight*2; 
     } else { 
      int childCount = appBarLayout.getChildCount(); 
      return childCount >= 1?ViewCompat.getMinimumHeight(appBarLayout.getChildAt(childCount - 1))*2:0; 
     } 
    } 

    private void animateIn(View view) { 
     view.setVisibility(View.VISIBLE); 
     ViewCompat.animate(view) 
       .scaleX(1.0F) 
       .scaleY(1.0F) 
       .alpha(1.0F) 
       .setInterpolator(fastOutSlowInInterpolator) 
       .withLayer() 
       .setListener((ViewPropertyAnimatorListener)null).start(); 
    } 

    private void animateOut(final View view) { 
     ViewCompat.animate(view) 
       .scaleX(0.0F) 
       .scaleY(0.0F) 
       .alpha(0.0F) 
       .setInterpolator(fastOutSlowInInterpolator) 
       .withLayer() 
       .setListener(new ViewPropertyAnimatorListener() { 
      public void onAnimationStart(View view) { 
       HidingBehavior.this.isAnimatingOut = true; 
      } 

      public void onAnimationCancel(View view) { 
       HidingBehavior.this.isAnimatingOut = false; 
      } 

      public void onAnimationEnd(View view) { 
       HidingBehavior.this.isAnimatingOut = false; 
       view.setVisibility(View.GONE); 
      } 
     }).start(); 
    } 
} 

Antwort

11

Wenn ich mich nicht täusche, diese Zeile ist nicht erforderlich, wo Sie sich gerade sie haben ...

app:layout_behavior="com.package.view.HidingBehavior" 

Die layout_behavior sollte auf die Geschwister von der des AppBarLayout und nicht auf ein angewendet werden (verschachtelt) Kind. Das ist so, weil es den Geschwistern in der CoordinatorLayout zeigt, wie sie ihr Verhalten als Reaktion auf das, was sie tun, koordinieren müssen.

Mit anderen Worten, wo Sie es haben, ist es nicht Koordinierung irgendein Verhalten mit jeder anderen Ansicht.

+0

Ok, das macht Sinn. Ich wollte, dass meine Ansicht mit CollapsingToolbarLayout verkleinert wird und ein bestimmtes Verhalten enthält. Es hört sich so an, als müsste ich beide zu einem Verhalten kombinieren, das ich als Geschwister des AppBarLayout anhefte. Vielen Dank! – bolder5

+0

genial ... du hast mich gerettet! Vielen Dank. –

Verwandte Themen