Android WebView 當文本框獲取焦點后自動放大,但這種自動放大不是我想要的。這并不是android的bug,而是他的正常處理 這是我最近兩個星期面臨的一個比較棘手的Bug,目前國內外都沒有大牛提供很好的解決方式。這里,我今天花了大半天時間來解決這個問題。
之所以出現這種情況,主要是當文本框獲取到焦點后,鍵盤自動彈出,會執行WebView的displaySoftKeyboard 方法,這個方法會把縮小的網頁恢復到正常情況(也就是說縮小的網頁放大),但是我目前的項目都是不允許頁面縮放的,所以一旦頁面放大后就無法恢復。 這里感謝國外的一個朋友的帖子回復
http://stackoverflow.com/questions/3702805/is-there-a-way-to-disable-the-zoom-feature-on-input-fields-in-webview/7214199#7214199 。
不多說,直接上代碼,如果想知道原因,看我后續的blog。 <!--EndFragment-->
<!--EndFragment-->
解決原理:
通過反射,拿到WebView的一個私有屬性mDefaultScale,并在WebView失去焦點的時候,修改它的值,已達到網頁不放大的效果。
view.setInitialScale(???); //???代表隨便多少,小于一百才會有我說的這個bug。
<!--EndF-->
解決方案如下:
Java代碼

- videoNavigation_WV.setOnFocusChangeListener(new View.OnFocusChangeListener() {
- @Override
- public void onFocusChange(View v, boolean hasFocus) {
- if(hasFocus)
- {
- try {
- Field defaultScale = WebView.class.getDeclaredField("mDefaultScale");
- defaultScale.setAccessible(true);
- //WebViewSettingUtil.getInitScaleValue(VideoNavigationActivity.this, false )/100.0f 是我的程序的一個方法,可以用float 的scale替代
- defaultScale.setFloat(videoNavigation_WV , WebViewSettingUtil.getInitScaleValue(VideoNavigationActivity.this, false )/100.0f);
- } catch (SecurityException e) {
- e.printStackTrace();
- } catch (IllegalArgumentException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (NoSuchFieldException e) {
- e.printStackTrace();
- }
- }
- }
- });
<!--EndFragmen-->
大家如果想利用我這段代碼,我這里面的defaultScale.setFloat(WebView,float), 這個float值是你初始化的時候的scale值。跟你的CSS body值有一定的關系。假如body值 是1920*1080 而你現在是顯示在1280*720的屏幕上,那么這個scale 的float值就是0.666667。就是你的現在的縮放頁面與正常情況先顯示的大小的比(縮放比),大家可以用頁面第一次加載的時候通過 getScale()值獲取。
代碼還有很多需要優化的地方,比如反射拿屬性,其實只要做一次,設置可以做多次,這里只是一個Demo,覺得代碼垃圾的話我發個改好的工程給你。
有木有做android TV 的 ,加群87154410,歡迎歡迎。 博客剛開始寫,希望大家支持。
寫都比較簡略,大家可以提建議,歡迎留言
posted on 2012-04-20 21:34
小果子 閱讀(4618)
評論(0) 編輯 收藏 引用 所屬分類:
Android & Ios