解决小米系统下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稍微上下滑动一点点即可。


转载注明出处:http://blog.csdn.net/qq454822252/article/details/39526681

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值