4

我有一個類onNestedScroll只調用一次

public class ScrollAwareFABBehavior extends FloatingActionButton.Behavior { 
    public ScrollAwareFABBehavior(Context context, AttributeSet attrs) { 
     super(); 
    } 

    public ScrollAwareFABBehavior() { 
     super(); 
    } 

    @Override 
    public boolean onStartNestedScroll(final CoordinatorLayout coordinatorLayout, final FloatingActionButton child,final View directTargetChild, final View target, final int nestedScrollAxes) { 
     return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL; 
    } 

    @Override 
    public void onNestedScroll(final CoordinatorLayout coordinatorLayout, final FloatingActionButton child,final View target, final int dxConsumed, final int dyConsumed,final int dxUnconsumed, final 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(); 
     } 
    } 
} 

問題是,onNestedScroll被稱爲只有當我滾動了recyclerview一次,所以晶圓廠隱藏永不再顯示。這裏是佈局我使用

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <android.support.v4.widget.SwipeRefreshLayout 
     android:id="@+id/refresh_layout" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
     <android.support.v7.widget.RecyclerView 
      android:id="@+id/list" 
      app:layoutManager="@string/vertical_linear_layout_manager" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"/> 
    </android.support.v4.widget.SwipeRefreshLayout> 
    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/add" 
     android:layout_width="wrap_content" 
     app:layout_behavior="mypackagename.util.ScrollAwareFABBehavior" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom|end" 
     app:useCompatPadding="true" 
     android:layout_margin="16sp" 
     android:src="@drawable/ic_add"/> 
</android.support.design.widget.CoordinatorLayout> 

我的支持庫版本25.1.0

回答

5

我剛纔answered 絕對在另一篇同樣的問題,檢查它。

說起不久,使用以下命令:

compile 'com.android.support:design:25.0.1' 
+0

爲了記錄在案,我最近嘗試切換到'com.android.support:設計:25.2.0'而這種行爲仍然是相同的。 – ocramot

+0

更好回答:https://stackoverflow.com/a/46727021/3397345 – Davidea

0

不要設置FAB的知名度,在child.hide GONE() - 使用隱形代替。從25.1.0開始,滾動事件不會傳遞到能見度爲GONE的視圖。

+1

但.hide()在支持庫中實現 – user3280437

18

我解決了使用以下代碼將可見性從GONE更改爲INVISIBLE的問題。

@Override 
public void onNestedScroll(CoordinatorLayout coordinatorLayout, final 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 onShown(FloatingActionButton fab) { 
       super.onShown(fab); 
      } 

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

謝謝。有用。這真的沒有道理。 – Kit

+1

@Kit如果視圖是「GONE」,它不再被視爲佈局的一部分,因此該視圖的'LayoutBehavior'不會被調用。當視圖是「INVISIBLE」時,它是佈局的一部分,但不可見。 – redwoolf

1
@Override 
public void onNestedScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull FloatingActionButton child, @NonNull View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int type) { 
    super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, type); 
    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

這個答案比Eduardo的答案要好(少代碼)。 條件('child.getVisibility()!= View.VISIBLE')也沒用。我使用支持lib v27.0.2 – Davidea