2013-08-12 13 views
14

Buduję WebView, który wyświetla stronę internetową. Witryna zawiera łącza bez atrybutu target="_blank", a niektóre z nim.Android - Otwórz cel _blank linki w WebView z zewnętrzną przeglądarką

Muszę otworzyć linki z target zdefiniowane w zewnętrznej przeglądarce urządzenia standardowego oraz te bez niego w WebView.

Używam WebViewClient i starałem się wokół tej funkcji, ale nadal wszystkie moje linki są otwierane w WebView:

Alternatywa 1:

@Override 
public boolean shouldOverrideUrlLoading(WebView view, String url) { 

    return super.shouldOverrideUrlLoading(view, url);   
} 

Alternatywa 2:

@Override 
public boolean shouldOverrideUrlLoading(WebView view, String url) { 

    view.loadUrl(url); 
    return true;   
} 

Czy ktoś wie, jak mogę otwierać puste linki zewnętrzne?

Dzięki!

PS: Aby uniknąć nieporozumień: Nie mogę użyć this approach, ponieważ jedynym sposobem w jaki sposób link powinien zostać otwarty zewnętrznie jest atrybut target.

Odpowiedz

30

Po odwiedzeniu powyższych linków wymyślam ten kod i mam nadzieję, że to pomoże.

wv.getSettings().setSupportMultipleWindows(true); 
wv.setWebChromeClient(new WebChromeClient() { 
    @Override 
    public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture, android.os.Message resultMsg) 
    { 
     WebView.HitTestResult result = view.getHitTestResult(); 
     String data = result.getExtra(); 
     Context context = view.getContext(); 
     Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(data)); 
     context.startActivity(browserIntent); 
     return false; 
    } 
}); 
+2

Ważne jest, aby zrozumieć, kiedy włącza onCreateWindow. Więcej informacji na ten temat można znaleźć w [link] (http://therockncoder.blogspot.in/2014/04/understanding-androids-webchromeclient.html). –

+0

Czy istnieje sposób, aby to zrobić za pomocą zwykłego klienta webview? –

+0

czasami 'dane' ma wartość null –

0

Też mam ten sam problem i teraz znalazłem rozwiązanie.

Musisz również użyć WebChromeClient. Możesz zobaczyć this i this. I możesz ustawić WebViewClient na nowy WebView i zastąpić metodę ShouldOverrideUrlLoading, następnie możesz uzyskać adres URL i zrobić, co chcesz tutaj. Jeśli nie ustawisz WebViewClient, myślę, że to też powinno działać. W moim przypadku chcę uzyskać adres URL, więc ustawiłem WebViewClient na nowy WebView.

Nawiasem mówiąc, jeśli usuniesz stary webview, to po powrocie z przeglądarki widok internetowy jest pusty. Tak więc zachowałem przeglądarkę internetową i dodałem nową, ale ustawiłem widoczność na "nie ma".

3

Zmierzyłem się z tym samym problemem. Chciałem otworzyć strony internetowe w aplikacji i wszystkie strony powinny być otwarte w Domyślnej przeglądarce. Użyłem jednej techniki. Jeśli adres URL zawiera moją nazwę strony internetowej, to otworzyłem ją w WebView i odpoczęłam wszystkie witryny otwarte w domyślnej przeglądarce.

Znajdź poniżej kod, mam nadzieję, że byłby przydatny dla wszystkich, którzy mieli takie problemy.

private class MyBrowser extends WebViewClient { 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     if (url.contains("/internetgeeks")) { 
      browser.loadUrl(url); 
      return false; 
     } else { 
      Intent intent = new Intent(Intent.ACTION_VIEW); 
      intent.setData(Uri.parse(url)); 
      startActivity(intent); 
      return true; 
     } 
    } 
} 
+0

Odpowiedź Carson-ip jest lepsza: to natywnie obsługuje' target = "_ blank" 'jak zapytano. – Guillaume

+0

Tylko w celu uzupełnienia odpowiedzi, startActivity nie była dla mnie dostępna, nazwałem 'intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);' i wywołałem działanie przez 'view.Context.ApplicationContext.StartActivity (intent);' – Daniel

Powiązane problemy