Android 滚动时在NestedScrollView中隐藏晶圆厂

Android 滚动时在NestedScrollView中隐藏晶圆厂,android,scrollview,floating-action-button,nestedscrollview,Android,Scrollview,Floating Action Button,Nestedscrollview,我有一个嵌套的ScrollView,里面有一些线性布局和文本视图之类的内容。 我使用floatingactionbutton库也是出于某些原因。所以我不能用任何行为来解释它。 我不知道应该如何处理scrollview中的scrollchangelistener,以便像行为一样动态隐藏和显示fab 有没有关于如何在滚动时隐藏和显示晶圆厂的建议?创建晶圆厂滚动行为类 public class FabScrollBehavior extends CoordinatorLayout.Behavior&l

我有一个嵌套的ScrollView,里面有一些线性布局和文本视图之类的内容。 我使用floatingactionbutton库也是出于某些原因。所以我不能用任何行为来解释它。 我不知道应该如何处理scrollview中的scrollchangelistener,以便像行为一样动态隐藏和显示fab


有没有关于如何在滚动时隐藏和显示晶圆厂的建议?

创建晶圆厂滚动行为类

public class FabScrollBehavior extends CoordinatorLayout.Behavior<FloatingActionButton> {
    private int toolbarHeight;

    public FabScrollBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.toolbarHeight = AppUtil.getToolbarHeight(context);
    }

    @Override
    public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton fab, View dependency) {
        return dependency instanceof AppBarLayout;
    }

    @Override
    public boolean onDependentViewChanged(CoordinatorLayout parent, FloatingActionButton fab, View dependency) {
        if (dependency instanceof AppBarLayout) {
            CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) fab.getLayoutParams();
            int fabBottomMargin = lp.bottomMargin;
            int distanceToScroll = fab.getHeight() + fabBottomMargin;
            float ratio = (float)dependency.getY()/(float)toolbarHeight;
            fab.setTranslationY(-distanceToScroll * ratio);
        }
        return true;
    }
}
然后在布局中添加到FloatingActionButton布局\u行为:

   <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab_task_accept"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end|bottom"
        android:layout_margin="@dimen/fab_margin"
        android:src="@drawable/ic_accepted"
        app:layout_behavior="pass.to.your.FabScrollBehavior.Class"
        app:theme="@style/Widget.AppTheme.Fab"/>

简单将以下代码添加到NestedScrollView ScrollChangeListener:

NestedScrollView nsv = v.findViewById(R.id.nsv);
    nsv.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
        @Override
        public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
            if (scrollY > oldScrollY) {
                fab.hide();
            } else {
                fab.show();
            }
        }
    });

在活动或片段中定义变量类型int,从ScrollView设置上一个滚动,然后使用此方法在ScrollView类中侦听更改滚动

 scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
        @Override
        public void onScrollChanged() {

    // previousScrollY this variable is define in your Activity or Fragment
            if (scrollView.getScrollY() > previousScrollY && floatingActionButton.getVisibility() == View.VISIBLE) {
                floatingActionButton.hide();
            } else if (scrollView.getScrollY() < previousScrollY && floatingActionButton.getVisibility() != View.VISIBLE) {
                floatingActionButton.show();
            }
            previousScrollY = scrollView.getScrollY();
        }
    });
scrollView.getViewTreeObserver().addOnScrollChangedListener(新的ViewTreeObserver.OnScrollChangedListener(){
@凌驾
public void onScrollChanged(){
//上一次滚动此变量是在活动或片段中定义的
if(scrollView.getScrollY()>previousScrollY&&floatingActionButton.getVisibility()==View.VISIBLE){
floatingActionButton.hide();
}else if(scrollView.getScrollY()

将完成所有版本的android

在花了这么多时间之后,我找到了解决方案。 它可以在所有情况下工作。虽然这是一个黑客不是正确的解决方案,但你可以应用它使这件事的工作

正如我们所知,
setOnScrollChangeListener
仅在最低api级别为23时才起作用,所以如果我的最低api级别低于23会怎么样

所以我从堆栈溢出中找到了解决方案,我们可以使用
getViewTreeObserver().addOnScrollChangedListener
来解决这个问题,所以这将是适用于所有设备的兼容解决方案

现在,让我们转到“嵌套滚动视图滚动时隐藏fab按钮,嵌套滚动视图处于理想状态时显示fab按钮”问题的最终解决方案

因此,我们可以使用
Handler
postDelayed
来解决这个问题

  • 在上下文中定义变量
    private int previousScrollY=0

  • 然后使用
    getViewTreeObserver().addOnScrollChangedListener
    到嵌套的滚动视图,如下所示

  • NESTEDSCROLLVIEW.getViewTreeObserver().addOnScrollChangedListener(新
    ViewTreeObserver.OnScrollChangedListener(){
    @凌驾
    public void onScrollChanged(){
    new Handler().postDelayed(new Runnable()){
    @凌驾
    公开募捐{
    if(NESTEDSCROLLVIEW.getScrollY()==previousScrollY){
    FABBUTTON.setVisibility(View.VISIBLE);
    }否则{
    FABBUTTON.setVisibility(视图.不可见);
    }
    }
    }, 10);
    previousScrollY=NESTEDSCROLLVIEW.getScrollY();
    }
    });

  • 现在你准备好出发了

  • 检查这些解决方案:已经有了。什么都不管用。请仔细阅读:并检查上的cheesesquareGitHub@piotrek1543请注意,我使用的floatingactionbutton库不同,不支持行为,因此如果我尝试添加“app:layout\u behavior=“package,应用程序崩溃。cheesesquare正在使用默认的FloatingAction按钮。抱歉,我忘记了。所以,问问这个库的作者,我的意思是在Github页面上创建问题非常棒,但是布局行为只使用“pass.to.FabScrollBehavior”,这需要API级别23或更高。你确定吗?我在API级别19中使用它。我非常确定。有。您将在右上角找到一条文字,上面写着“Added in API level 23”,您的IDE也应该指出这一点;这是真的。它确实是这样工作的,但是它只在嵌套的ScrollView上工作。这是不可靠的。它偶尔工作。另外,当滚动结束时,FAB应该显示更好的ux,这是不可能的,因为状态无法读取。
    NestedScrollView nsv = v.findViewById(R.id.nsv);
        nsv.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
            @Override
            public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
                if (scrollY > oldScrollY) {
                    fab.hide();
                } else {
                    fab.show();
                }
            }
        });
    
     scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
            @Override
            public void onScrollChanged() {
    
        // previousScrollY this variable is define in your Activity or Fragment
                if (scrollView.getScrollY() > previousScrollY && floatingActionButton.getVisibility() == View.VISIBLE) {
                    floatingActionButton.hide();
                } else if (scrollView.getScrollY() < previousScrollY && floatingActionButton.getVisibility() != View.VISIBLE) {
                    floatingActionButton.show();
                }
                previousScrollY = scrollView.getScrollY();
            }
        });