F.A.B隐藏,但不显示

问题描述:

试图实施Floating Action Button(F.A.B)隐藏向下滚动,并显示在向上滚动。F.A.B隐藏,但不显示

我有ScrollAwareFABBehavior.java来管理这个,它连接到XML中的F.A.B activity_main问题: F.A.B隐藏向下滚动,但当我向上滚动时不再显示。我记录了onNestedScroll方法,它在向下滚动时调用“调用滚动”和“调用以隐藏”;但在F.A.B隐藏后,没有任何3x Log

问:为什么F.A.B在隐藏F.A.B后向上滚动时不显示。

ScrollAwareFABBehavior.java:

import android.content.Context; 
import android.support.design.widget.CoordinatorLayout; 
import android.support.design.widget.FloatingActionButton; 
import android.support.v4.view.ViewCompat; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.View; 

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

    @Override 
    public boolean onStartNestedScroll(final CoordinatorLayout coordinatorLayout, final FloatingActionButton child, 
             final View directTargetChild, final View target, final int nestedScrollAxes) { 
     // Ensure we react to vertical scrolling 
     return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL 
       || super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes); 
    } 

    @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); 
     Log.d("test", "calling scroll"); 
     if (dyConsumed > 0 && child.getVisibility() == View.VISIBLE) { 
      // User scrolled down and the FAB is currently visible -> hide the FAB 
      Log.d("test", "calling to hide"); 
      child.hide(); 
     } else if (dyConsumed < 0 && child.getVisibility() != View.VISIBLE) { 
      // User scrolled up and the FAB is currently not visible -> show the FAB 
      Log.d("test", "calling to show"); 
      child.show(); 
     } 
    } 
} 

activity_main.xml中:

<android.support.design.widget.CoordinatorLayout 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/main_content" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="companyname.appname.MainActivity"> 


     <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/rv_contactlist" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:clipToPadding="false" 
      android:paddingBottom="16dp" 
      android:paddingTop="16dp" 
      android:scrollbars="vertical" /> 

     <android.support.design.widget.FloatingActionButton 

      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="bottom|end" 
      android:layout_margin="16dp" 
      android:src="@drawable/ic_add_circle_outline_black_24dp" 
      app:layout_anchor="@id/rv_contactlist" 
      app:layout_anchorGravity="bottom|right|end" 
      android:layout_alignParentEnd="true" 
      app:fabSize="normal" 
      android:layout_alignParentBottom="true" 
      android:onClick="addItem" 
      app:layout_behavior="companyname.appname.ScrollAwareFABBehavior"/> 

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

您是否尝试过使用这个方法http://stackoverflow.com/questions/32038332/using-google-design-library-how-to-hide-fab-button-on-scroll-down? –

+1

我认为'child.hide();'现在将视图设置为'GONE'而不是'INVISIBLE',所以这段代码不起作用。检查'.hide()'确实做了什么... –

+0

@MarkKeen我可以用什么来代替? –

支持库版本,你在你的项目中使用?

如果您使用最新的(我的意思是25.0.x),这是因为fab.hide()方法将可见性设置为View.GONE。这使嵌套的滚动监听器停止检查fab,第二次尝试滚动列表。

更多细节可以在这里找到:https://code.google.com/p/android/issues/detail?id=230298

而且我搜索了一下发现这个类似的问题已经有了一个很好的答案: Floating action button not visible on scrolling after updating Google Support & Design Library

所以,一个可能的解决办法是重写fab.hide方法,不要将可见性设置为GONE而是INVISIBLE。

而且我认为这可能会从上游得到修复,所以请留意一下。

使用前面建议的双重检查方法。一个晶圆厂可以同时显示和隐形,以便完美地显示晶圆厂:

fab.show(); fab.setVisibility(View.VISIBLE);

由于Android对25.0.x更新+你应该设置与听众晶圆厂按钮隐身可再次显示晶圆厂按钮,我的解决办法是下一个:

public class ScrollAwareFABBehavior extends FloatingActionButton.Behavior { 
private static final String TAG = "ScrollAwareFABBehavior"; 

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


@Override 
public boolean onStartNestedScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull FloatingActionButton child, @NonNull View directTargetChild, @NonNull View target, int axes, int type) { 
    return true; 
} 

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

    return false; 
} 

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

**测试在一台Nexus 6P与Android奥利奥。