9

Próbuję ustawić layout_behavior na element, który jest dzieckiem CollapsingToolbarLayout ale zachowanie nigdy nie jest wywoływana na widoku iv_header. Działa doskonale podczas zakotwiczenia na zewnątrz, na przykład w widoku tv_follow.Układ Android Zachowanie nie jest wywoływana, gdy dziecko CollapsingToolbarLayout

Dokumentacja nie mówi konkretnie, że layout_behavior nie może być zastosowany w ramach AppBarLayout lub CollapsingToolbarLayout, więc nie rozumiem, dlaczego nie działa.

<?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> 

Zachowanie zostało wyciągnięte z kodu FloatingActionButton w bibliotece wsparcia projektu.

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(); 
    } 
} 

Odpowiedz

11

Jeśli się nie mylę, ta linia jest niepotrzebna, gdzie obecnie mają go ...

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

The layout_behavior powinny być stosowane do rodzeństwa z tego AppBarLayout a nie do (zagnieżdżone) dziecko. Dzieje się tak, ponieważ mówi rodzeństwu, wewnątrz CoordinatorLayout, w jaki sposób muszą koordynować swoje zachowania w odpowiedzi na to, co robią.

Innymi słowy, jeśli je masz, nie jest to koordynowanie żadnego zachowania z innym widokiem.

+0

OK, to ma sens. Chciałem, aby mój pogląd zmniejszył się dzięki CollapsingToolbarLayout i zawierał określone zachowanie. Wygląda na to, że musiałbym połączyć oba zachowania w jedno zachowanie, które dołączam jako rodzeństwo AppBarLayout. Dzięki! – bolder5

+0

niesamowite ... uratowałeś mnie! Dzięki. –

Powiązane problemy