4

Android Support 라이브러리를 버전 25.4.0에서 26.0.0 (최대 27.0.0)으로 업데이트 한 후 활동 내에서 툴바 축소 중 이상한 동작이 발생합니다. 이러한 GIF를에Collapsing Toolbar가 지원 lib 26.0.0 이후로 글리치 수신 거부

참조 차이 : 위로 스크롤 할 때

  • 26.0.0 (+)
    • 25.4.0
    • 당신이 도구 모음을 붕괴의 이상한 바운스를 볼 수 있습니다. 같은 문제가 발생

      <?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/appBar" 
           android:layout_width="match_parent" 
           android:layout_height="wrap_content" 
           android:background="@color/white_opacity10" 
           android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 
      
           <android.support.design.widget.CollapsingToolbarLayout 
            android:id="@+id/collapsing" 
            android:layout_width="match_parent" 
            android:layout_height="match_parent" 
            app:contentScrim="?attr/colorPrimary" 
            app:layout_scrollFlags="scroll|exitUntilCollapsed|snap" 
            app:scrimAnimationDuration="@integer/scrim_animation_short" 
            app:titleEnabled="false"> 
      
            <FrameLayout 
             android:layout_width="match_parent" 
             android:layout_height="wrap_content" 
             android:layout_gravity="center" 
             app:layout_collapseMode="parallax"> 
      
             <!-- Here is layout of header --> 
      
            </FrameLayout> 
      
            <android.support.v7.widget.Toolbar 
             android:id="@+id/toolbar" 
             android:layout_width="match_parent" 
             android:layout_height="?attr/actionBarSize" 
             android:layout_gravity="top" 
             android:layout_marginBottom="?attr/actionBarSize" 
             app:layout_collapseMode="pin"/> 
      
            <android.support.design.widget.TabLayout 
             android:id="@+id/tabLayout" 
             android:layout_width="match_parent" 
             android:layout_height="?attr/actionBarSize" 
             android:layout_gravity="bottom" 
             app:tabGravity="center" 
             app:tabMode="scrollable" 
             app:tabSelectedTextColor="@color/white" 
             app:tabTextColor="@color/white_inactive"/> 
      
           </android.support.design.widget.CollapsingToolbarLayout> 
      
          </android.support.design.widget.AppBarLayout> 
      
          <FrameLayout 
           android:id="@+id/content" 
           android:layout_width="match_parent" 
           android:layout_height="match_parent" 
           app:layout_behavior="@string/appbar_scrolling_view_behavior"> 
      
           <android.support.v4.view.ViewPager 
            android:id="@+id/viewPager" 
            android:layout_width="match_parent" 
            android:layout_height="match_parent"/> 
      
          </FrameLayout> 
      
      </android.support.design.widget.CoordinatorLayout> 
      

      누구 :

      은 노호 레이아웃의 코드를 참조하십시오? 이 지원 lib 버그, 또는 나 뭔가 잘못하고 있습니까?

      편집 : 당신이 화면을 던지다 때

    +0

    당신이 무슨 일이 일어나고 있는지의 GIF/비디오를 게시 할 수 있습니까? – damian

    +0

    질문 : https://imgur.com/Wz1yF1o - 25.4.0, https://imgur.com/a/ynVGS - 26.0.0 –

    답변

    0

    내가 경험 비슷하게 AppBarLayout에 대한 사용자 지정 동작을 정의하여 해결했습니다.

    <android.support.design.widget.AppBarLayout 
         android:id="@+id/main_appbar" 
         android:layout_width="match_parent" 
         android:layout_height="wrap_content" 
         android:background="@color/white_40" 
         android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
         app:layout_behavior="CustomFlingBehavior"> 
    
         <android.support.design.widget.CollapsingToolbarLayout 
          android:id="@+id/main_collapsing" 
          android:layout_width="match_parent" 
          android:layout_height="144dp" 
          app:layout_scrollFlags="scroll|exitUntilCollapsed"> 
    
          <LinearLayout 
           android:id="@+id/ll_horizontal_ruler" 
           android:layout_width="match_parent" 
           android:layout_height="1dp" 
           android:layout_gravity="bottom" 
           android:orientation="horizontal"/> 
    
         </android.support.design.widget.CollapsingToolbarLayout> 
        </android.support.design.widget.AppBarLayout> 
    

    여기에 대답을 기반으로

    public final class FlingBehavior extends AppBarLayout.Behavior { 
    
    private static final int TOP_CHILD_FLING_THRESHOLD = 3; 
    private boolean isPositive; 
    private boolean enabled = true; 
    
    public FlingBehavior() { 
        setDragCallback(); 
    } 
    
    public FlingBehavior(Context context, AttributeSet attrs) { 
        super(context, attrs); 
        setDragCallback(); 
    } 
    
    private void setDragCallback() { 
        setDragCallback(new DragCallback() { 
         @Override 
         public boolean canDrag(@NonNull AppBarLayout appBarLayout) { 
          return enabled; 
         } 
        }); 
    } 
    
    @Override 
    public boolean onNestedFling(CoordinatorLayout coordinatorLayout, 
              AppBarLayout child, View target, float 
              velocityX, float velocityY, boolean 
              consumed) { 
        if (velocityY > 0 && !isPositive || velocityY < 0 && isPositive) { 
         velocityY = velocityY * -1; 
        } 
        if (target instanceof RecyclerView && velocityY < 0) { 
         final RecyclerView recyclerView = (RecyclerView) target; 
         final View firstChild = recyclerView.getChildAt(0); 
         final int childAdapterPosition = recyclerView.getChildAdapterPosition(firstChild); 
         consumed = childAdapterPosition > TOP_CHILD_FLING_THRESHOLD; 
        } 
        return super.onNestedFling(coordinatorLayout, child, target, velocityX, velocityY, consumed); 
    } 
    
    @Override 
    public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dx, int dy, int[] consumed) { 
        super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed); 
        isPositive = dy > 0; 
    } 
    
    public void setEnabled(boolean enabled) { 
        this.enabled = enabled; 
    } 
    
    @Override 
    public boolean onStartNestedScroll(CoordinatorLayout parent, AppBarLayout child, View directTargetChild, View target, int nestedScrollAxes) { 
        return enabled && super.onStartNestedScroll(parent, child, directTargetChild, target, nestedScrollAxes); 
    } 
    
    public boolean isEnabled() { 
        return enabled; 
    } 
    } 
    

    : https://stackoverflow.com/a/40091360/494179

    +1

    이 해결 방법이 작동합니다. 동료가 Google에 문제를보고했습니다. 문제가 해결되어 향후 릴리스 중 하나 인 것으로 보입니다. https://issuetracker.google.com/issues/69540491 –