首页 > 代码库 > 解决小米系统下ViewPager、ScrollView内嵌套WebView时,Touch事件不响应的问题

解决小米系统下ViewPager、ScrollView内嵌套WebView时,Touch事件不响应的问题

前言:一直拿原生android4.4的Nexus5测试,结果装到老大的小米上,出了bug。安卓的兼容性问题真是....难以形容。


Bug详细描述:本人用webview运行JS Goole地图,单独使用该webview时一切正常,而当放在scrollview和viewpager下,小米手机上便无法移动地图,其他手机是没问题的。


解决方案:

一、ScrollView内嵌套WebView

作为一个新手,我简单的检查了viewpager和scrollview的三个函数(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)的返回值,貌似小米和其他手机都没有有区别。

看了一篇关于“touch事件传递机制”的帖子(传送门http://www.xuebuyuan.com/610044.html ),我试验了Demo之后,终于发现了问题的所在。

小米的ScrollView会屏蔽掉它所有子View的上下手势,它将给子View MotionEvent.ACTION_CANCEL事件,这样会导致后续的MotionEvent事件都只传递到ScrollView截止。

于是我将onInterceptTouchEvent的返回值改为false,这里大家肯定会很奇怪好像前面说的跟这里的解决方法对不上,这里我没深入研究,初步猜测是小米系统改了原生ScrollView的onInterceptTouchEvent函数代码,使得传递到子View的MotionEvent事件变成了MotionEvent.ACTION_CANCEL。


二、ViewPager内嵌套WebView

本以为解决了前一个问题,这个问题应该是类似的,结果没有用处。很奇怪,ViewPager和WebView的所有与TouchEvent相关的函数,在小米和其他机子上打印出来的结果是完全一致的。

好吧,仔细看看,还是发现了不同,小米的Log多出了一个错误:Should not happen: no rect-based-test nodes found。

百度之后,参考了http://blog.csdn.net/rambomatrix/article/details/22503077 解决方案。

原来是因为viewpager在切换页面的时候,fragment中的webview没有监测到自己处于可见状态。因此,当你发现webview应该处于visible状态的时候就让它动一下,进而告知webkit来准备响应。

于是用代码让webview稍微上下滑动一点点即可。

解决小米系统下ViewPager、ScrollView内嵌套WebView时,Touch事件不响应的问题