2013-10-12 5 views
7

मैं वेबव्यू में एक वेबपृष्ठ लोड करना चाहता हूं लेकिन वेबपृष्ठ के हिस्सों को हटा देना चाहता हूं। इसलिए, मैंने कस्टम वेब व्यू क्लाइंट बनाया है। और, पेज पर समाप्त(), मैंने कुछ तत्वों को हटाने के लिए कुछ जावास्क्रिप्ट किया था। फिर, मैंने वेब दृश्य दिखाई दिया।WebView.loadUrl में एंड्रॉइड जेएस()

हालांकि, जब मैं इसे चलाता हूं, तो यह दृश्य दृश्यमान सेट करता है, और फिर मैं तत्वों को हटाया जा रहा हूं। ऐसा लगता है जैसे जेएस पृष्ठभूमि में बहुत धीरे-धीरे चल रहा है। यह एक खराब देखने का अनुभव बनाता है क्योंकि यह पूर्ण पृष्ठ और फिर वांछित आंशिक पृष्ठ चमकता है।

यहाँ मेरी 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);    
      } 
     }); 
    } 
} 

इसलिए, यह बनाने का एक संयोजन था इंटरफ़ेस को कॉल करने से पहले जेएस कॉल समाप्त होने की प्रतीक्षा करने के लिए एक जावास्क्रिप्ट इंटरफेस और जेएस फ़ंक्शन बनाना (दृश्यमान के साथ) यह सेटिंग्स)।

+0

धन्यवाद ... केवल ट्रे कैच जोड़ना चाल था ... –

0

आप के साथ अपने WebView तेजी लाने के लिए कोशिश कर सकते:

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

फिर भी, यदि आप अभी अपना WebView दिखाई नहीं कर रही किया जाना चाहिए। क्यों आप एक इंटरफेस (http://developer.android.com/guide/webapps/webview.html को देखें, एंड्रॉयड के लिए जावा स्क्रिप्ट कोड बाइंडिंग) बना सकते हैं और करने के लिए अपने जावास्क्रिप्ट से कॉल कर नहीं है:

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

के बाद एनिमेशन समाप्त हो गया है?

+0

मैंने अभी इंटरफ़ेस बनाने की कोशिश की, लेकिन जेएस समाप्त होने से पहले यह अभी भी दिखाई दे रहा है। मैंने पीछा किया: http://stackoverflow.com/questions/16342100/android-hide-webview-until-javascript-is-done –

+0

मैं खुद जेएस विशेषज्ञ नहीं हूं लेकिन बदलने के बाद सेटटाइमआउट (yourAndroidCallbackFunction, 5000) का उपयोग करने का प्रयास करता हूं शैलियों को देखने के लिए कि क्या समस्या है। – armandooj

+1

अब यह काम कर रहा है; सहायता के लिए धन्यवाद! –