NestedScrollView是support.v4包下的一个控件,这个控件和ScrollView没有多大的区别,这个控件其实是MD(Meterial Design)中设计用来跟MD中的其他控件兼容。就像RecyclerView代替了ListView,而NestedScrollView代替了ScrollView。这里我们就讨论NestedScrollView的用法,而是研究NestedScrollView的一个Bug,就是NestedScrollView滑动后,其子View首次点击无效,第二次点击就是OK。相关Issues。
根据问题,debug后发现,在NestedScrollView的onInterceptTouchEvent()方法发现,当用户滑动停止后MotionEvent.ACTION_DOWN时,mIsBeingDragged= !mScroller.isFinished(),而mScroller.isFinished()=false,也就是说mIsBeingDragged = true,这样事件就被拦截掉了,所以子View就无法接到事件。
博主这里的解决方法是:新建一个NestedScrollView,将系统NestedScrollView源码复制到自己新建NestedScrollView里,然后将mIsBeingDragged = !mScroller.isFinished();注释掉,下面加上一句mIsBeingDragged = false;即可:
但是还要在修改一个地方,不然无法编译通过,在新建NestedScrollView中initScrollView()的方法里将
mScroller = new ScrollerCompat(getContext(), null);换成mScroller = ScrollerCompat.create(getContext(), null);,在布局中将系统NestedScrollView替换成自己的NestedScrollView就OK了。
具体请参考: stackoverflow。