滚动时在NestedScrollView中隐藏FAB

时间:2016-01-01 22:42:36

标签: android scrollview floating-action-button nestedscrollview

我正在使用nestedscrollview,内容类似于一些linearlayouts和textviews。 我也出于某些原因使用了floatingactionbutton库。所以我不能使用任何行为。 我不知道如何处理scrollviewlistener从scrollview隐藏并像行为一样动态显示fab。

如何在滚动时隐藏和显示工厂的任何建议?

5 个答案:

答案 0 :(得分:25)

将以下代码简单地添加到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();
            }
        }
    });

答案 1 :(得分:10)

创建FabScrollBehavior类

 confusion.mat <- structure(c(0, 0, 0, 0, 0, 0, 0, 0, 0), .Dim = c(3L, 3L))
 intersection.list <- c(1, 2)

AppUtil.getToolbarHeight(context)是 -

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 layout_behavior:

public static int getToolbarHeight(Context context) {
        final TypedArray styledAttributes = context.getTheme().obtainStyledAttributes(
                new int[]{R.attr.actionBarSize});
        int toolbarHeight = (int) styledAttributes.getDimension(0, 0);
        styledAttributes.recycle();

        return toolbarHeight;
    }

整个布局看起来像

   <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"/>

https://mzgreen.github.io/2015/02/15/How-to-hideshow-Toolbar-when-list-is-scroling(part1)/

实施

答案 2 :(得分:3)

在Activity或片段中定义变量类型int以从ScrollView设置上一个Scroll然后使用此方法侦听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();
        }
    });

将完成所有版本的android

答案 3 :(得分:0)

花了这样的时间后,我找到了解决方案。 它可能在所有情况下都有效。虽然这不是一个适当的解决方案,但是您可以应用它来使此功能正常工作。

我们知道setOnScrollChangeListener仅在最小api为23时才有效,所以如果我的最小api级别小于23怎么办?。

因此我从堆栈溢出中找到了解决方案,我们可以为此使用getViewTreeObserver().addOnScrollChangedListener,所以这将是所有设备的兼容解决方案。

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

为此,我们可以将HandlerpostDelayed结合使用以解决此问题。

  1. 在您的上下文private int previousScrollY = 0;

  2. 中定义变量
  3. 然后使用getViewTreeObserver().addOnScrollChangedListener这样的嵌套滚动视图。

NESTEDSCROLLVIEW.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() { @Override public void onScrollChanged() { new Handler().postDelayed(new Runnable() { @Override public void run() { if (NESTEDSCROLLVIEW.getScrollY() == previousScrollY) { FABBUTTON.setVisibility(View.VISIBLE); } else { FABBUTTON.setVisibility(View.INVISIBLE); } } }, 10); previousScrollY = NESTEDSCROLLVIEW.getScrollY(); } });

  1. 现在您可以开始了。...

答案 4 :(得分:0)

 nestedScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
            @Override
            public void onScrollChanged() {
                if (nestedScrollView != null) {
                    if (nestedScrollView.getChildAt(0).getBottom() <= (nestedScrollView.getHeight() + nestedScrollView.getScrollY())) {
                        fab.setVisibility(View.INVISIBLE);
                    } else {
                        fab.setVisibility(View.VISIBLE);
                    }
                }
            }
        });