2013-03-12 13 views
5

è possibile verificare se l'utente ha fatto clic su un collegamento html con target = "_ blank".WebView Android: Determinare <a> target = "_ blank"

Quello che voglio fare è visualizzare htlm nella mia app in una WebView, ma avviare i collegamenti "esterni" nel browser predefinito di Android. Un link "esterno" è per me un link con target = "_ blank". Tutti gli altri collegamenti devono essere gestiti nella visualizzazione Web.

Così, per esempio: l'utente fa clic su un link come questo nel mio WebView:

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

e poi voglio aprire la data URL nel browser Android.

L'ho provato con shouldOverrideUrlLoading(), ma a questo punto non riesco a determinare se l'obiettivo era "_blank" o un collegamento normale (senza destinazione).

Ho provato anche setSupportMultipleWindows (true); in combinazione con onCreateWindow(), ma in questo callback non riesco a ottenere l'url.

Non posso cambiare il codice HTML che viene visualizzato, quindi non posso usare un ponte JavaScript con addJavascriptInterface()

Che altro posso fare? Qualche altra idea?

+0

Come è stato risolto? – Sagar

risposta

1

È possibile effettuare le seguenti operazioni: (brutto ma funziona)

all'interno onPageFinished(), iniettare un frammento di codice JavaScript nella pagina che fa qualcosa di simile:

  1. itera su tutti gli elementi con un target = _blank attribuire
  2. cambiamento href per quegli elementi a esterno: // [href originale]

Se il sito utilizza jquery dovrebbe essere facile. In caso contrario, è ancora possibile farlo utilizzando il DOM standard Javascript.

sul tuo shouldOverrideUrlLoading(), cerca quelli esterni: // * link e aprirli esternamente.

Al fine di iniettare il javascript, effettuare le seguenti operazioni:

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

Ho appena risolto questo problema io stesso. Ecco come l'ho risolto.

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

Questo ha un problema però, si apre bene la prima volta che apri un tale link, ma i clic successivi non fanno nulla (la maggior parte del tempo). Testato su due dispositivi. Ha funzionato quando ho destory 'newWebView', ad esempio, nel metodo' shouldOverrideUrlLoading', chiama 'Handler.postDelayed (xxx, 200);' dove 'xxx' è un eseguibile in cui si chiama il metodo' destroy() ' 'newWebView'. – jadkik94

Problemi correlati