更新Google支持和devise库后,浮动操作button在滚动中不可见

我试过更新com.android.support:appcompatcom.android.support:design从25.0.1到25.1.0,如下所示:

 compile 'com.android.support:appcompat-v7:25.0.1' compile 'com.android.support:design:25.0.1' 

至:

 compile 'com.android.support:appcompat-v7:25.1.0' compile 'com.android.support:design:25.1.0' 

但是我发现当活动滚动时,我的浮动动作button不再出现。 我的FAB行为由以下定义:

 public class MyFabBehavior extends FloatingActionButton.Behavior { public MyFabBehavior(Context context, AttributeSet attrs) { super(); } @Override public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View directTargetChild, View target, 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(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) { // User scrolled up -> hide the FAB animateFab(child, View.GONE); } else if (dyConsumed > 0) { // User scrolled down -> show the FAB animateFab(child, View.VISIBLE); } } static public void animateFab(FloatingActionButton fab, int visibility) { // ignore visibility passed in, and just make fab visible regardless if (fab.getVisibility() != View.VISIBLE) { fab.show(); } } } 

我的布局如下:

 <android.support.design.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <android.support.v4.widget.NestedScrollView android:id="@+id/main_scrollview" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="8dp" > ... </android.support.v4.widget.NestedScrollView> <android.support.design.widget.FloatingActionButton app:layout_behavior="com.example.MyFabBehavior" android:id="@+id/fab" app:fabSize="normal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_marginBottom="@dimen/fab_margin" android:layout_marginRight="@dimen/fab_margin" android:onClick="saveButton" app:elevation="6dp" app:pressedTranslationZ="12dp" app:backgroundTint="@color/colorPrimary" android:src="@drawable/ic_done_white_24dp" /> </android.support.design.widget.CoordinatorLayout> 

Solutions Collecting From Web of "更新Google支持和devise库后,浮动操作button在滚动中不可见"

从支持库25.0.1更新到25.1.0更改CoordinatorLayoutonNestedScroll方法,因为对于其可见性设置为View.GONE视图,将跳过调用。

在浮动操作button上调用child.hide()将视图的可见性设置为View.GONE ,这意味着现在(从25.1.0开始), onNestedScroll方法调用将在未来跳过浮动操作button(因为它跳过所有视图的可见性都是GONE )。

解决这个问题的方法是将隐藏视图的可见性设置为INVISIBLE 。 这样,下一次执行嵌套滚动时, onNestedScroll不会跳过视图。

为了达到这个目的,你可以打电话

 child.hide(new FloatingActionButton.OnVisibilityChangedListener() { /** * Called when a FloatingActionButton has been hidden * * @param fab the FloatingActionButton that was hidden. */ @Override public void onHidden(FloatingActionButton fab) { super.onShown(fab); fab.setVisibility(View.INVISIBLE); } }); 

在你的onNestedScroll方法。

编辑:此问题已通过https://code.google.com/p/android/issues/detail?id=230298提交给AOSP问题跟踪&#x5668;

在CoordinatorLayout中25.1.0(

  for (int i = 0; i < childCount; i++) { final View view = getChildAt(i); if (view.getVisibility() == GONE) { // If the child is GONE, skip... continue; } 

在25.0.1

 for (int i = 0; i < childCount; i++) { final View view = getChildAt(i); final LayoutParams lp = (LayoutParams) view.getLayoutParams(); if (!lp.isNestedScrollAccepted()) { continue; } final Behavior viewBehavior = lp.getBehavior(); if (viewBehavior != null) { viewBehavior.onNestedScroll(this, view, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed); accepted = true; } 

自支持lib版本25.1.0以来,行为已经改变。

它必须是触发FAB可见性更改的RecyclerView(行为)。

换句话说,不再是对象的责任,而是想要反应有一个行为,但在移动的对象意识到屏幕上的一切。

以下是diff的链接,显示了执行升级所需的更改:

https://github.com/chrisbanes/cheesesquare/compare/master…ianhanniballake:scroll_aware_fab