標籤: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及其以下版本中不能滑動的問題