Android - 解决ViewPager嵌套时在API 13及其以下版本中不能滑动的问题

通过对ViewPager事件处理的分析发现解决此问题的关键点在于判断是否可以横向滑动的部分,也就是canScroll(View, boolean, int, int, int)方法
技术分享

在此方法中先依次递归判断子View是否可以横向滑动,在最后一行则判断自己是否可以横向滑动。关键处在于调用了ViewCompat.canScrollHorizontally(View, int)方法来判断是否可以横向滑动。进一步查看ViewCompat.canScrollHorizontally(View, int)的源码
技术分享

不同版本有不同的实现
技术分享

ICS版本重写了canScrollHorizontally(View, int),调用ViewCompatICS.canScrollHorizontally(View, int)
技术分享

ViewCompatICS.canScrollHorizontally(View, int)调用了View新增的canScrollHorizontally(int)方法
技术分享

HCViewCompatImpl继承自GBViewCompatImpl,没有重写canScrollHorizontally(View, int)方法
技术分享

GBViewCompatImpl继承自EclairMr1ViewCompatImpl,没有重写canScrollHorizontally(View, int)方法
技术分享

EclairMr1ViewCompatImpl继承自BaseViewCompatImpl,没有重写canScrollHorizontally(View, int)方法
技术分享

BaseViewCompatImpl的canScrollHorizontally(View, int)方法直接返回false
技术分享

以上源码分析可总结为在API14以上是调用View新增的canScrollHorizontally(int)方法判断的,而在API13及其以下则直接返回false,可以理解为不支持。

那么这就无解了吗,当然不能够。既然ViewPager在API14以上可以正常滑动那么必然是重写了canScrollHorizontally(int)方法,查看ViewPager的canScrollHorizontally(int)方法源码发现此方法不存在版本兼容问题,在API13及其以下版本上也可直接调用。于是乎解决办法就是继承ViewPager重写canScroll(View, boolean, int, int, int)方法,直接调用canScrollHorizontally(int)即可,如下:
技术分享

详情可查看我开源的项目CompatViewPager https://github.com/xiaopansky/CompatViewPager

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。