2013-03-12 9 views
5

czy można sprawdzić, czy użytkownik kliknął link html z target = "_ blank".Android WebView: Ustalenie <a> target = "_ blank"

Co chcę zrobić, to wyświetlić htlm w mojej aplikacji w WebView, ale uruchom linki "zewnętrzne" w domyślnej przeglądarce android. "Zewnętrzny" link to dla mnie link z target = "_ blank". Wszystkie pozostałe łącza powinny być obsługiwane w widoku internetowym.

Tak na przykład: użytkownik kliknie link jak to w moim WebView:

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

a następnie chcę, aby otworzyć dany adres URL w przeglądarce Android.

Próbowałem go z shouldOverrideUrlLoading(), ale w tym momencie nie mogę określić, czy cel był "_blank" czy normalny link (bez celu).

Próbowałem również setSupportMultipleWindows (true); w połączeniu z onCreateWindow(), , ale w tym wywołaniu zwrotnym nie mogę uzyskać adresu URL.

nie mogę zmienić kod HTML, który jest wyświetlany, więc nie mogę użyć Most JavaScript z addJavascriptInterface()

Co jeszcze mogę zrobić? Każdy inny pomysł?

+0

Jak naprawiłeś w końcu? – Sagar

Odpowiedz

1

można wykonać następujące czynności: (brzydki ale będzie działać)

wewnątrz onPageFinished(), wstrzykiwać javascript fragment kodu do strony, która robi coś takiego:

  1. iteruje na wszystkich elementach w cel = _blank atrybutów
  2. zmiany liczby sekcję tych elementów do zewnętrznych: // [oryginalny sekcję]

Jeśli witryna używa jquery, powinno być łatwe. Jeśli nie, nadal możesz to zrobić za pomocą standardowego DOM Javascript.

na swoim shouldOverrideUrlLoading(), poszukaj zewnętrznych: // * linków i otwórz je zewnętrznie.

Aby wstrzyknąć javascript, wykonaj następujące czynności:

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

Właśnie rozwiązać tej kwestii siebie. Oto jak to naprawiłem.

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

Ma to jednak pewien problem, otwiera się dobrze przy pierwszym otwarciu takiego linku, ale kolejne kliknięcia nie robią nic (większość czasu). Testowano to na dwóch urządzeniach. To zadziałało, gdy zniszczę 'newWebView' chociaż, w metodzie' shouldOverrideUrlLoading', wywołaj 'Handler.postDelayed (xxx, 200);' gdzie 'xxx' jest operatorem, w którym nazywasz metodę' destroy() 'na 'newWebView'. – jadkik94

Powiązane problemy