9

Tôi đang cố gắng đặt layout_behavior trên phần tử là con của CollapsingToolbarLayout nhưng hành vi không bao giờ được gọi trên chế độ xem iv_header. Nó hoạt động hoàn hảo khi neo bên ngoài như với chế độ xem tv_follow.Hành vi bố cục Android không được gọi khi con của CollapsingToolbarLayout

Tài liệu không cụ thể nói rằng không thể áp dụng layout_behavior trong số AppBarLayout hoặc CollapsingToolbarLayout vì vậy tôi không biết tại sao tài liệu không hoạt động.

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

Hành vi được lấy ra khỏi FloatingActionButton code trong thư viện hỗ trợ thiết kế.

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

Trả lời

11

Nếu tôi không nhầm, dòng này là không cần thiết mà bạn đang có nó ...

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

Các layout_behavior nên được áp dụng cho các anh chị em ruột của các AppBarLayout và không để một (lồng nhau) con. Điều này là bởi vì nó nói với các anh chị em, bên trong các CoordinatorLayout, làm thế nào họ cần phải phối hợp hành vi của họ để đáp ứng với những gì họ đang làm.

Nói cách khác, nơi bạn có, nó không phải là phối hợp bất kỳ hành vi nào với bất kỳ chế độ xem nào khác.

+0

Ok, điều này có ý nghĩa. Tôi muốn nhìn của tôi để thu nhỏ với CollapsingToolbarLayout và chứa một hành vi cụ thể. Có vẻ như tôi sẽ phải kết hợp cả hai thành một Hành vi mà tôi đính kèm với tư cách là anh chị em của AppBarLayout. Cảm ơn! – bolder5

+0

tuyệt vời ... bạn đã cứu tôi! Cảm ơn. –

Các vấn đề liên quan