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

时间: 2024-10-14 19:51:29

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

解决div嵌套时IE8和FF无法自适应高度

解决div嵌套时IE8和FF无法自适应高度 还是做类似新浪评论回复的时候,将回复的DIV嵌套在一个DIV中,然后点击回复的时候显示子DIV,这是父DIV的高度是会变化的,于是我将父DIV的高度设置为height:auto;可是问题就出现了,在IE6和IE7下父DIV的高度可以自适应而在IE8和FF下却不可以,于是我开始在网上搜索,嘿嘿,现在的网络知识共享真好,让我找到解决办法了! 在父DIV的CSS中添加两个属性值 clear:both; overflow:auto; OK啦!希望对遇到同样问题

Android 解决ViewPager双层嵌套的滑动问题

之前在做自己的一个项目的时候,遇到广告栏图片动态切换,我第一时间想到的就是ViewPager,整个软件只有广告这一部分ViewPager还好说,但是软件越复杂出现的问题越多,尤其是遇到ViewPager双层嵌套问题,找了很多资料 解决方法一:自定义ViewPager做为父ViewPager控件 public class ParentViewPager extends ViewPager{ private int childVPHeight=0; public ParentViewPager(Co

Android - 解决ViewPager使用DepthPageTransformer时事件会被下一页捕获导致事件错乱的问题

实际情况是你在调用 viewPager.setPageTransformer(boolean, PageTransformer)方法设置PageTransformer时第一个参数给的false,应该设置true才对. 这是因为ViewPager默认下一个页面是绘制在上一个页面的上面,DepthPageTransformer对下一个页面的处理是只设为全透明,但还是位于屏幕中央.这样一来下一个页面虽然看不见,但实际上是存在于上一个页面的上面的,理所当然就会拦截事件. 而第一个参数的意思就是是否要反转

Android之viewPager嵌套viewPager无法滑动子viewPager

现在最头疼的事就是需求不明确,这不,有遇到你个奇葩需求,父viewPager总共有三个选项卡,第一个选项卡里嵌入一个子viewPager,这时候问题就来了,子viewPager无法滑动,我猜的事父viewPager把子viewPager拦截了,于是尝试了下面的第一种方法 1.重写父viewPager的onInterceptTouchEvent方法 /** * @author 子墨 * * 2015-2-26上午8:59:50 */ public class MyViewPager extends

Android解决使用findViewById时需要对返回值进行类型转换问题的辅助类

在我们的开发工作时,findViewById可能是用得最多的函数之一,但它特别讨厌的地方就是我们经常需要对返回的view进行类型转换,输入麻烦.代码丑陋,例如以前我们在Activity中找一些子控件一般是这样 : @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 查

Android 解决ScrollView嵌套RecyclerView导致滑动不流畅的问题

最近做的项目中遇到了ScrollView嵌套RecyclerView,刚写完功能测试,直接卡出翔了,后来通过网上查找资料和 自己的实践,找出了两种方法解决这个问题. 首先来个最简单的方法: recyclerView.setNestedScrollingEnabled(false); 这个方法就可以解决这一问题. 既然有首先那肯定有第二种解决的办法,只不过相对于第一种方法来说就太麻烦了. 我们知道ScrollView嵌套listView或者GridView的时候需要自定义listView或者是Gr

解决mingw动态库在vs下调用 release版本中会出现的奇怪问题

REF | NOREF /OPT:REF 清除从未引用的函数和/或数据,而 /OPT:NOREF 保留从未引用的函数和/或数据. 默认情况下,LINK 移除未引用的封装函数. 如果对象已经用 /Gy 选项编译过,它包含封装函数 (COMDAT). 此优化称为可传递的 COMDAT 消除. 若要重写该默认值并在程序中保留未引用的 COMDAT,请指定 /OPT:NOREF. 可以使用 /INCLUDE 选项重写特定符号的移除. 如果指定了 /DEBUG,/OPT 的默认项是 NOREF(否则,为 

eclipse-java-2018-09-win32-x86_64配置tomcat(内含更新eclipse,如何解决添加时找不到最新tomcat版本)

我下的是eclipse精简版,建议下载企业版,可以省略后面的很多步骤(其中的辛酸...) 这里就是说明下载精简版的eclipse如何配置tomcat的步骤,其实还是更新eclipse的步骤 1.首先点击windows中的preferences 2.打开preferences中的server 3.打开runtime environment 4.我下载的是tomcat8.5所以选择tomcat8.5,然后点击finish,tomcat已经配置到eclipse中了,打开eclipse可以创建web工程

Android Studio项目构建时遇到的常见问题及解决办法

1.项目构建常见问题解决[重要] 1.1. 创建或导入项目后编译时一直在等待 问题: 原因:AS连网去下载gradle了,但是网络不好或不通 解决:禁用网络,AS就会立即自动终止下载进入到主界面了.此时再去指定离线的gradle版本进行编译: 1.2. Unknow host 'services.gradle.org' 问题: 原因:当你导入第三方项目时,别人项目使用的gradle的版本与你的不一样,这时as就会连网去下载gradle版本,但是找不到services.gradle.org服务器.