2017-07-03 12 views
0

実際には2つのWebviewがあり、最初のWebviewに基づいて他のWebviewをズーム/パンしたいと思います。このため、アプリケーションは既にAndroid 3.0までうまく動作する次のコードを使用しますが、それ以降のデバイスでは動作しません。私はチェックし、例外がスローされました。mZoomManagerのField Not Found例外です。JavaでAndroid WebViewをズーム/拡大する方法

ウェブビューをズームするための代替方法を知りたいですか? webView.setInitialScale()を使用できません。

public void setScale(float scale_factor) throws IllegalArgumentException, 
     IllegalAccessException, ClassNotFoundException { 
    try { 
     float temp_scale = scale_factor * 0.01f; 
     Class<WebView> webViewClass = (Class<WebView>) this.getClass() 
       .getSuperclass(); 
     Field mZoomManagerField = webViewClass 
       .getDeclaredField("mZoomManager"); 
     mZoomManagerField.setAccessible(true); 
     Object mZoomManagerInstance = mZoomManagerField.get(this); 

     Class<?> zoomManagerClass; 
     try { 
      zoomManagerClass = Class.forName("android.webkit.ZoomManager"); 
      Field mInitialScale = zoomManagerClass 
        .getDeclaredField("mInitialScale"); 
      mInitialScale.setAccessible(true); 
      mInitialScale.set(mZoomManagerInstance, temp_scale); 

      Field mActualScale = zoomManagerClass 
        .getDeclaredField("mActualScale"); 
      mActualScale.setAccessible(true); 
      if (temp_scale >=1) { 
       mActualScale.set(mZoomManagerInstance, temp_scale); 
      } else { 
       Field mDefaultScale = zoomManagerClass 
         .getDeclaredField("mDefaultScale"); 
       mDefaultScale.setAccessible(true); 
       Object obj=temp_scale; 
       mDefaultScale.set(mZoomManagerInstance, obj); 
       mActualScale.set(mZoomManagerInstance, temp_scale); 
      } 

      Field mInvActualScale = zoomManagerClass 
        .getDeclaredField("mInvActualScale"); 
      mInvActualScale.setAccessible(true); 
      mInvActualScale.set(mZoomManagerInstance, 1/temp_scale); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } catch (NoSuchFieldException e) { 
     e.printStackTrace(); 
    } 

} 

答えて

0

は3日間調査した結果、私は23に

をアンドロイドレベル8からの支援を与えなければならなかったとして、任意の解決策を見つけることができませんでしたので、私は

dependentWebView.setInitialScale(mainWebView.getScale()*100); 
を使用して思い付きました

を開き、dependentWebViewを再度ロードします。

この場合のスケーリングは完全ではありません。私はより正確な浮動小数点値を与えるためにsetInitialScaleをオーバーライドしようとしましたが、異なるアンドロイドバージョンでスケーリングが異なる方法で処理されるため、それを行うことはできませんでした。

誰かが助けを求めるようにこのソリューションを投稿してください。

関連する問題