解決小米系統下ViewPager、ScrollView內嵌套WebView時,Touch事件不響應的問題

來源:互聯網
上載者:User

標籤: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事件不響應的問題

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.