2012-04-02 13 views
0

Ich möchte in der Lage sein, einige Verarbeitung auf dem HTML-und JavaScript einer Seite zu tun, bevor es dem Benutzer meiner App vorgestellt wird. Die Seite verwendet window.open für alle Links und das öffnet ein neues Browserfenster, das nicht von meiner App gesteuert wird, was die Illusion der Verwendung einer App zerstört. Dies ist, was ich gerade habe, was meiner Meinung nach größtenteils funktionieren wird.Execute-Methode in JavascriptInterface nach dem Laden der Seite

class LinkFixer 
{ 
    static HashMap<String,String>pages = new HashMap<String,String>();//static so multiple pages can access it 

    public void processPage(String html) 
    { 
     html = html.replace("window.open","LinkFixer.openInNewTab"); 
    } 

    public void openInNewTab(String url, String targetName) 
    { 
     if(!pages.containsKey(targetName))//targetName is unique for every link 
     { 
      pages.put(targetName,url); 
      //add new tab to my TabHost, which will contain a WebView with page from url loaded 
     } 

     //move user to tab 
    } 
} 
WebView browser = (WebView)findViewById(R.id.browser); 
browser.getSettings().setJavaScriptEnabled(true); 

browser.addJavascriptInterface(new LinkFixer(), "LinkFixer"); 
browser.loadUrl("http://serverIP:port/mobilecontrol.html"); 
//something to make the browser execute LinkFixer.processPage goes here 

Das Problem habe ich mit ihm werde, ist, dass ich nicht sicher bin, wie ich die Seite ausführen LinkFixer.processPage machen, wenn die Seite fertig geladen. Ansonsten denke ich, dass der Code funktioniert. Irgendwelche Vorschläge?

Antwort

1

Ich habe einen neuen WebChromeClient erstellt und überschreibt die onProgressChanged-Methode, um die Links zu reparieren, nachdem newProgress 100 oder höher ist.

browser.setWebChromeClient(new WebChromeClient() 
    { 
     public void onProgressChanged(WebView webView, int newProgress) 
     { 
      super.onProgressChanged(webView,newProgress); 
      if(newProgress >= 100) 
      { 
       System.out.println("Done loading"); 
       browser.loadUrl("javascript:document.getElementsByTagName(\"html\")[0].innerHTML = window.LinkFixer.processPage((document.getElementsByTagName(\"html\")[0].innerHTML))"); 
      } 
     } 
    }); 

Welche genau funktioniert, wie ich es will

Verwandte Themen