2013-10-12 19 views
7

WebView'e bir web sayfası yüklemek, ancak web sayfasının bölümlerini kaldırmak istiyorum. Bu yüzden özel bir WebViewClient oluşturdum. Ve, onPageFinished(), bazı öğeleri kaldırmak için bazı javascript yaptım. Sonra WebView'i görünür hale getirdim.WebView.loadUrl() içindeki JS JS

Ancak, çalıştırdığımda görünümü görünür olarak ayarlar ve sonra kaldırılan öğeleri görürüm. JS arka planda çok yavaş koşuyormuş gibi. Tüm sayfayı ve ardından istenen kısmi sayfayı yanıp söndüğü için zayıf bir izleme deneyimi yaratır. İşte

benim onPageFinished edilir()

@Override 
public void onPageFinished(WebView view, String url) { 

    view.loadUrl("javascript:" 
      + "document.getElementsByClassName('header')[0].style.display='none';" 
      + "document.getElementById('section_0').style.display='none';" 
      + "document.getElementById('page-actions').style.display='none';" 
      + "document.getElementsByClassName('languageSelector')[0].style.display='none';" 
      + "document.getElementById('mw-mf-last-modified').style.display='none';" 
      + "document.getElementById('footer').style.display='none';"); 

    loadingView.setVisibility(View.INVISIBLE); 
    view.setVisibility(View.VISIBLE); 
} 

Bunu düzeltmek konusunda herhangi bir fikir?

cevap

15

: MainActivity() in

this.webView.addJavascriptInterface(new JsObject(webView, loadingView), "CallToAnAndroidFunction"); 

: MainActivity.onCreate() in

view.loadUrl("javascript:" 
      + "var FunctionOne = function() {" 
      + " var r = $.Deferred();" 
      + " try{document.getElementsByClassName('header')[0].style.display='none';}catch(e){}" 
      + " try{document.getElementById('section_0').style.display='none';}catch(e){}" 
      + " try{document.getElementById('page-actions').style.display='none';}catch(e){}" 
      + " try{document.getElementsByClassName('languageSelector')[0].style.display='none';}catch(e){}" 
      + " try{document.getElementById('mw-mf-last-modified').style.display='none';}catch(e){}" 
      + " try{document.getElementById('footer').style.display='none';}catch(e){}" 
      + " setTimeout(function() {" 
      + " r.resolve();" 
      + " }, 2500);" 
      + " return r;" 
      + "};" 
      + "var FunctionTwo = function() {" 
      + " window.CallToAnAndroidFunction.setVisible();" 
      + "};" 
      + "FunctionOne().done(FunctionTwo);"); 

Yani

public class JsObject { 
    private View loadingView; 
    private View view; 
    JsObject(View view, View loadingView){this.view = view;this.loadingView = loadingView;} 
    @JavascriptInterface 
    public void setVisible(){ 
     runOnUiThread(new Runnable() { 

      @Override 
      public void run() { 
       view.setVisibility(View.VISIBLE); 
       loadingView.setVisibility(View.INVISIBLE);    
      } 
     }); 
    } 
} 

, bu yapım bir arada oldu JavascriptInterface ve JS çağrısının arabirimi çağırmadan önce bitmesini beklemek için JS işlevi yapmak (visibil ile) ity ayarları).

+0

Teşekkürler ... Sadece YTL CATCH ekleyerek hile yaptı ... –

0

şununla WebView'ı hızlandırmak için deneyebilirsiniz: Neyse

webview.getSettings().setRenderPriority(RenderPriority.HIGH); 
webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); 

, hemen WebView görünür hale edilmemelidir. Neden bir arabirimi (Android için JavaScript kodu Bağlama, http://developer.android.com/guide/webapps/webview.html bakın) oluşturmak ve sizin javascript bir çağrı yapmazlar: animasyonlar bittikten sonra

public void myCallback(){ view.SetVisibilitu(View.VISIBLE) }; 

?

onPageFinished() in
+0

Sadece arabirimi oluşturmayı denedim, ancak JS bitmeden önce yine de görünür hale geliyor. Takip ettim: http://stackoverflow.com/questions/16342100/android-hide-webview-until-javascript-is-done –

+0

Kendim js uzmanı değilim ama değiştirdikten sonra setTimeout (YourAndroidCallbackFunction, 5000) kullanmaya çalışıyorum sorun olup olmadığını görmek için stilleri. – armandooj

+1

Şimdi çalıştım; yardım için teşekkürler! –