標籤:des android style blog http color io 使用 ar
前言:一直拿原生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事件不響應的問題