2013-10-12 20 views
7

Tôi muốn tải trang web trong WebView nhưng xóa các phần của trang web. Vì vậy, tôi đã tạo một WebViewClient tùy chỉnh. Và, trong onPageFinished(), tôi đã làm một số javascript để loại bỏ một số yếu tố. Sau đó, tôi đã hiển thị WebView.Android JS trong WebView.loadUrl()

Tuy nhiên, khi tôi chạy nó, nó đặt chế độ xem hiển thị và sau đó tôi thấy các yếu tố bị xóa. Nó giống như là JS đang chạy trong nền rất chậm. Nó tạo ra một trải nghiệm xem kém bởi vì nó nhấp nháy toàn bộ trang và sau đó là một phần trang mong muốn.

Sau đây là tôi onPageFinished()

@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); 
} 

Bất kỳ ý tưởng về làm thế nào để sửa lỗi này?

Trả lời

15

Trong onPageFinished():

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);"); 

Trong MainActivity.onCreate():

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

Trong MainActivity():

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);    
      } 
     }); 
    } 
} 

Vì vậy, nó là sự kết hợp của việc một JavascriptInterface và tạo một hàm JS để đợi các cuộc gọi JS kết thúc trước khi gọi giao diện (với visibil cài đặt ity).

+0

Cảm ơn ... Chỉ thêm TRY CATCH đã thực hiện thủ thuật ... –

0

Bạn có thể thử để tăng tốc độ WebView của bạn với:

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

Anyways, bạn không nên làm WebView của bạn có thể nhìn thấy ngay lập tức. Tại sao bạn không tạo ra một giao diện (tham khảo http://developer.android.com/guide/webapps/webview.html, đóng mã JavaScript để Android) và thực hiện cuộc gọi từ javascript của bạn để:

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

sau khi hình ảnh động đã kết thúc?

+0

Tôi vừa thử tạo giao diện, nhưng nó vẫn hiển thị trước khi JS hoàn tất. Tôi theo sau: http://stackoverflow.com/questions/16342100/android-hide-webview-until-javascript-is-done –

+0

Tôi không phải là chuyên gia js, nhưng cố gắng sử dụng setTimeout (yourAndroidCallbackFunction, 5000) sau khi thay đổi các phong cách để xem đó có phải là vấn đề không. – armandooj

+1

Đã làm việc ngay bây giờ; cảm ơn đã giúp đỡ! –

Các vấn đề liên quan