2016-12-14 4 views
17

최신 지원 라이브러리 버전으로 업그레이드하고 스크롤 FAB 동작이 작동하지 않습니다. RecyclerView를 아래로 스크롤하면 올바르게 스크롤되지만, 다시 위로 스크롤하면 올바르게 스크롤되지 않습니다. 그것은 숨겨진 채로 있습니다. 25.0.1로 다운 그레이드하는 것이이 문제를 완화하는 것으로 보입니다. 여기에 내가 사용하는 코드가 있습니다. 25.1.0 Android 지원 lib가 파산 상태입니다.

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:animateLayoutChanges="true" 
    android:fitsSystemWindows="true" 
    tools:context=".mainhost.MainActivity" 
    tools:openDrawer="start"> 

    <android.support.design.widget.CoordinatorLayout xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_main_coordinator_layout_root_view" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".mainhost.MainActivity"> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appbar_layout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/AppTheme.AppBarOverlay"> 

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

     <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary" 
     android:focusableInTouchMode="true" 
     app:layout_collapseMode="pin" 
     app:popupTheme="@style/AppTheme.PopupOverlay" /> 

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

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

    <!-- Layout for content is here. This can be a RelativeLayout --> 

    <FrameLayout 
     android:id="@+id/content_main" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_marginLeft="-3dp" 
     android:layout_marginRight="-3dp" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" 
     tools:context="com.globyworks.citykey.mainhost.MainActivity" /> 


    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/fab" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom|end" 
     android:layout_margin="@dimen/fab_margin" 
     app:layout_behavior="com.globyworks.citykey.helpers.ScrollingFABBehavior" 
     android:src="@drawable/drawer_new_report_white" /> 

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


    <android.support.design.widget.NavigationView 
    android:id="@+id/navigation_view" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:background="@android:color/white" 
    app:menu="@menu/menu_drawer"> 

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


</android.support.v4.widget.DrawerLayout> 

그리고 스크롤 클래스 : 나는 (25.1.0로 업그레이드 후) tabview와 같은 문제의 비트

public class ScrollingFABBehavior extends FloatingActionButton.Behavior { 


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

    public boolean onStartNestedScroll(CoordinatorLayout parent, FloatingActionButton child, View directTargetChild, View target, int nestedScrollAxes) { 

     return true; 
    } 

    @Override 
    public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton child, View dependency) { 
     if (dependency instanceof RecyclerView) { 
      return true; 
     } 

     return false; 
    } 

    @Override 
    public void onNestedScroll(CoordinatorLayout coordinatorLayout, 
           FloatingActionButton child, View target, int dxConsumed, 
           int dyConsumed, int dxUnconsumed, int dyUnconsumed) { 
     super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, 
          dxUnconsumed, dyUnconsumed 
     ); 
     if (dyConsumed > 0 && child.getVisibility() == View.VISIBLE) { 
      child.hide(); 
     } else if (dyConsumed < 0 && child.getVisibility() != View.VISIBLE) { 
      child.show(); 
     } 
    } 
} 
+0

내가 떠올라 요 같은 문제가 여전히 있습니다. 마침내 누군가 질문을 올렸다! – wax911

답변

26

현재 코디네이터 레이아웃은 onNestedScroll 메서드를 호출 할 동작을 찾을 때 GONE으로 설정된보기를 건너 뜁니다.

빠른 해결 방법은 end of the FAB's hide animation에서 FAB의 가시성을 INVISIBLE으로 설정하는 것입니다.

if (dyConsumed > 0 && child.getVisibility() == View.VISIBLE) { 
    child.hide(new FloatingActionButton.OnVisibilityChangedListener() { 
     @Override 
     public void onHidden(FloatingActionButton fab) { 
      super.onHidden(fab); 
      fab.setVisibility(View.INVISIBLE); 
     } 
    }); 
} else if (dyConsumed < 0 && child.getVisibility() != View.VISIBLE) { 
    child.show(); 
} 
+0

'현재'는 다시 변경 될 예정입니까? 이것에 버그 나 토론이 있는지 아십니까? – khusrav

+0

나는이 행동의 변화가 25.1.0에 소개 되었기 때문에 버그라고 생각 하겠지만 발행 티켓이나 Google의 의견을 알지 못합니다. – jhorvat

+3

https://code.google.com/p/android/issues/detail?id=230298 – Luiz

-1

그것은 처음 보여 주지만, 두 번째 (다시 채우기 후) 보이지 않게됩니다.

+0

그래서 뭐? 이것은 대답이 아닙니다. Downvoted. –

0

위의 사용자 지정 OnVisibilityChangedListener는 나를위한 해결책의 일부일뿐입니다. INVISIBLE에 팹 설정 업데이트를, 대신 사라지다, 지금 가시성에 대한 테스트가 보이지 않는 존재에 onNestedScroll() 재정의 다른 경우 상태를 업데이트 할 필요있다 :

@Override 
public void onNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) { 
    super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed); 
    if(dyConsumed > 0 && child.getVisibility() == View.VISIBLE){ 
     child.hide(new FloatingActionButton.OnVisibilityChangedListener() { 
      @Override 
      public void onHidden(FloatingActionButton fab) { 
       super.onHidden(fab); 
       fab.setVisibility(View.INVISIBLE); 
      } 
     }); 
    } else if(dyConsumed < 0 && child.getVisibility() == View.INVISIBLE){ 
     child.show(); 
    } 
} 
+0

원래 코드는 'else if'부분에'child.getVisibility()! = View.VISIBLE'을 사용 했으므로 다음을 포함합니다 'INVISIBLE'과'GONE'. 다른 답변에 대한 사소한 개선 사항 만 게시하는 것을 피하십시오. 댓글을 달거나 수정 제안을하십시오. –