Android 更新Google Support&;后滚动时不可见浮动操作按钮;设计库

Android 更新Google Support&;后滚动时不可见浮动操作按钮;设计库,android,android-appcompat,Android,Android Appcompat,我已尝试将com.android.support:appcompat和com.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' <android.support.design.widget.CoordinatorLayout android:layout_

我已尝试将
com.android.support:appcompat
com.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'
<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>
致:

但我发现当活动滚动时,我的浮动操作按钮不再出现。我的工厂行为定义如下:

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();
        }
    }
}
公共类MyFabBehavior扩展了FloatingActionButton.Behavior{
公共行为(上下文、属性集属性){
超级();
}
@凌驾
开始嵌套滚动时的公共布尔值(CoordinatorLayout CoordinatorLayout,
FloatingActionButton子对象、视图directTargetChild、视图目标、int嵌套滚动轴){
//确保我们对垂直滚动做出反应
返回NestedScrollAxis==ViewCompat.SCROLL\u AXIS\u VERTICAL
||super.onStartedScroll(坐标布局、子对象、directTargetChild、目标、嵌套滚动轴);
}
@凌驾
public void onNestedScroll(CoordinatorLayout CoordinatorLayout,FloatingActionButton子对象,
查看目标,int dxConsumed,int dyConsumed,int dxUnconsumed,int dyUnconsumed){
super.onNestedScroll(协调布局、子项、目标、dxConsumed、dyConsumed、dxUnconsumed、dyUnconsumed);
if(dyconsumered<0){
//用户向上滚动->隐藏晶圆厂
animateFab(子对象、视图、消失);
}否则,如果(动态消耗>0){
//用户向下滚动->显示晶圆厂
animateFab(子对象,视图.可见);
}
}
静态公共void animateFab(FloatingActionButton fab,int可见性){
//忽略传入的可见性,不管怎样都要使fab可见
if(fab.getVisibility()!=View.VISIBLE){
fab.show();
}
}
}
我的布局如下:

compile 'com.android.support:appcompat-v7:25.0.1'
compile 'com.android.support:design:25.0.1'
<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>

...

在CoordinatorLayout 25.1.0中(

for(int i=0;i
在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;

        }
for(int i=0;i
从支持库
25.0.1
更新到
25.1.0
更改了
onNestedScroll
协调布局的
方法,即对可见性设置为
视图的视图跳过调用。消失了

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

解决方法是在隐藏视图时将其可见性设置为不可见。这样,下次执行嵌套滚动时,
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
方法中


编辑:此问题已提交到AOSP问题跟踪程序,地址为

自support lib version
25.1.0
以来,行为已发生变化

触发晶圆厂可视性变化的必须是RecyclerView(行为)

换句话说,它不再是想要做出反应的对象的责任,而是在移动的对象上意识到屏幕上的一切

以下是指向差异的链接,其中显示了执行升级所需的更改:


在我的
活动的
onCreate()
中,我确实在
floatingAction按钮上调用了
hide()
,这样它开始隐藏,然后在滚动时显示(通过定义的行为)。调用
hide()
将其可见性设置为
已消失
并且您的代码片段是否暗示在滚动事件中浮动操作按钮将因此永远被忽略?当然不是?您救了我的工作,先生。谢谢!哇,这太疯狂了!我们发现更新到25.1.1'时出现了相同的问题,谢谢您的建议。ove中看起来像是输入错误rride方法。应该是
super.onHidden(fab)
我认为。它像一个符咒一样工作。这是一个支持Snackbar的C#版本:哦,天哪!自从上次使用相同的代码以来,我已经浪费了好几个小时思考出了什么问题,在版本升级后它就不工作了!谢谢,工作得像符咒一样!但是这个bug很烦人!