码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2015-04-28 11:42:06      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:android   滑动   viewpager   嵌套   

通过对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

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

标签:android   滑动   viewpager   嵌套   

原文地址:http://blog.csdn.net/u013308121/article/details/45333549

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!