Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
432 views
in Technique[技术] by (71.8m points)

CoordinatorLayout中再嵌套CoordinatorLayout滑动冲突怎么解决?

我的问题是在CoordinatorLayout中再嵌套一个CoordinatorLayout,两个都有自定义Behavior并都重写onStartNestedScroll的时候,只能监听到子CoordinatorLayout的滑动,也就是只执行了子CoordinatorLayout的自定义Behavior。

我的主布局是CoordinatorLayout,之中嵌套了一个ViewPager,以及toolbar和底部tab
在ViewPager的第一个Fragment中有一个RecyclerView和一个在此列表之上的一个LinerLayout
现在我利用自定义Behavior已经实现下滑动列表的时候,toolbar和底部tab都消失到屏幕外,上滑的时候回来
而我的第一个Fragment之中,那个LinerLayout也想利用Behavior来监听列表滑动并减小自己的高度,
因为CoordinatorLayout的自定义Behavior只能对直接子View有效,所以我想将Fragment的主布局设置为coordinatorlayout
现在问题来了,自定义Behavior的onStartNestedScroll函数返回true的时候,toolbar和底部tab就检测不到滑动了

目前尝试的方法有

将该LinerLayout包裹在AppBarLayout中,并设置RecyclerView的Behavior为appbar_scrolling_view_behavior
结果是toolbar和Tab都不会隐藏了

自己定义Behavior,重写onStartNestedScroll函数并返回true后,外部toolbar和Tab都不会隐藏了

主布局的Behavior,可以隐藏和显示tab

    public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) {
        if (child.getVisibility() == View.VISIBLE && viewY == 0) {
            viewY = coordinatorLayout.getHeight() - child.getY();
        }
        return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL;//判断是否竖直滚动
    }

    @Override
    public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed) {
        if (dy >=0&&!isAnimate&&child.getVisibility()==View.VISIBLE) {
            //隐藏的动画
        } else if (dy <0&&!isAnimate&&child.getVisibility()==View.GONE) {
            //显示动画
        }
    }

ViewPager中首个Fragment的布局自定义Behavior
测试的时候仅仅只将onStartNestedScroll函数返回true就发现外部的toolbar和tab都不会隐藏了

不知是不是因为CoordinatorLayout不能嵌套,还是我应该在子CoordinatorLayout在进行一次判断?该如何判断呢?
还是说要实现这种效果,就不能考虑两个CoordinatorLayout嵌套?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

你把Behavior写在你主布局的ViewPager中就行了


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...