2013-03-12 4 views
5

ist es möglich zu überprüfen, ob der Benutzer auf einen HTML-Link mit dem Ziel geklickt hat = "_ blank".Android WebView: Ermitteln <a> target = "_ blank"

Was ich tun möchte, ist HTML in meiner App in einem WebView anzuzeigen, aber starten Sie "externe" Links in der Android-Standard-Browser. Ein "externer" Link ist für mich eine Verbindung mit target = "_ blank". Alle anderen Links sollten in der Webansicht behandelt werden.

So zum Beispiel: der Benutzer klickt auf einen Link wie dies in meinem WebView:

<a href="http://www.google.com" target="_blank">new window</a> 

und dann möchte ich die angegebene URL in dem Android-Browser öffnen.

Ich versuchte es mit shouldOverrideUrlLoading(), aber an dieser Stelle kann ich nicht feststellen, ob das Ziel "_blank" oder eine normale Verbindung (ohne Ziel) war.

Ich versuchte auch setSupportMultipleWindows (true); in Kombination mit onCreateWindow(), , aber in diesem Callback kann ich die URL nicht abrufen.

Ich kann das HTML ändern, die angezeigt wird, so kann ich nicht eine JavaScript-Brücke mit addJavascriptInterface()

Was sonst verwenden kann ich tun? Irgendeine andere Idee?

+0

Wie hast du endlich repariert? – Sagar

Antwort

1

Sie können wie folgt vorgehen: (hässlich aber funktioniert)

innerhalb onPageFinished(), ein JavaScript-Code-Fragment in die Seite injizieren, die wie etwas tut:

  1. iteriert über alle Elemente mit einem Ziel _blank = für diese Elemente auf externe die href
  2. Änderung Attribut: // [Original href]

Wenn die Seite jQuery verwendet, sollte es einfach sein. Wenn nicht, können Sie es immer noch mit Standard-DOM-Javascript machen.

Suchen Sie auf Ihrem shouldOverrideUrlLoading() nach diesen external: // * -Links und öffnen Sie sie extern.

Um die JavaScript aktivieren, gehen Sie wie folgt zu injizieren:

webView.loadUrl("javascript:(function() { PLACE YOUR JS CODE HERE })()"); 
3

ich dieses Problem mich nur gelöst. Hier ist, wie ich es behoben habe.

mWebView.setWebChromeClient(new WebChromeListener() { 
    @Override 
    public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture, Message resultMsg) { 
     WebView newWebView = new WebView(view.getContext()); 
     newWebView.setWebViewClient(new WebViewClient() { 
      @Override 
      public boolean shouldOverrideUrlLoading(WebView view, String url) { 
       Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
       startActivity(browserIntent); 
       return true; 
      } 
     }); 
     WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj; 
     transport.setWebView(newWebView); 
     resultMsg.sendToTarget(); 
     return true; 
    } 
}); 
+0

Dies hat ein Problem, aber es öffnet sich in Ordnung, wenn Sie zum ersten Mal einen solchen Link öffnen, aber die nächsten Klicks tun nichts (die meisten der ganzen Zeit). Getestet auf zwei Geräten. Es funktionierte, wenn ich "newWebView", aber in der "shouldOverrideUrlLoading" -Methode, 'Handler.postDelayed (xxx, 200);' wo 'xxx' ist ein runnable, in dem Sie rufen Sie die' destroy() 'Methode auf die 'newWebView'. – jadkik94

Verwandte Themen