2013-10-12 3 views
7

Я хочу загрузить веб-страницу в WebView, но удалить части веб-страницы. Итак, я создал собственный WebViewClient. И, в onPageFinished(), я сделал некоторый javascript, чтобы удалить некоторые элементы. Затем я сделал видимым WebView.Android JS в WebView.loadUrl()

Однако, когда я запускаю его, он отображает вид, а затем я вижу удаляемые элементы. Это похоже на то, что JS работает в фоновом режиме очень медленно. Это создает плохой обзор, потому что он мигает на полной странице, а затем на желаемой частичной странице.

Вот мой 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); 
} 

Любые идеи о том, как это исправить?

ответ

15

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

В MainActivity.onCreate():

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

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

Таким образом, это была комбинация решений JavascriptInterface и создание JS-функции для ожидания завершения JS-вызовов до вызова интерфейса (с помощью visibil ity).

+0

Спасибо ... Только добавив TRY CATCH сделал трюк ... –

0

Вы могли бы попытаться ускорить ваш WebView с:

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

В любом случае, вы не должны делать ваши WebView видны сразу. Почему вы не создать интерфейс (см http://developer.android.com/guide/webapps/webview.html, Binding код JavaScript для Android) и сделать вызов из вашего JavaScript, чтобы:

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

после анимации закончились?

+0

Я просто попытался сделать интерфейс, но он все еще становится видимым до завершения JS. Я последовал за этим: http://stackoverflow.com/questions/16342100/android-hide-webview-until-javascript-is-done –

+0

Я сам не специалист по js, но попытаюсь использовать setTimeout (yourAndroidCallbackFunction, 5000) после смены стили, чтобы увидеть, если это проблема. – armandooj

+1

Теперь он работает; Спасибо за помощь! –

Смежные вопросы