2011-02-05 12 views
5

Mam WebView, w którym chcę otwierać linki należące do domeny www.example.org w widoku internetowym, podczas gdy wszystkie pozostałe linki (jeśli kliknięto) są otwierane przez domyślną przeglądarkę poza moją aplikacją.Jak utworzyć linki w widoku strony lub otworzyć domyślną przeglądarkę w zależności od nazwy domeny?

Próbowałem użyć public boolean shouldOverrideUrlLoading (widok WebView, URL ciąg), ale nie działa poprawnie.

Oto kod, który nie działa:

public class MyWebViewClient extends WebViewClient { 
    @Override 
       public boolean shouldOverrideUrlLoading(WebView view, String url) { 
        try { 
        URL urlObj = new URL(url); 
        if (urlObj.getHost().equals("192.168.1.34")) { 
         view.loadUrl(url); 
         return true; 
        } else { 
         view.loadUrl(url); 
         return false; 
        } 
        } catch (Exception e) { 

        } 
       } 
} 

W obu przypadkach (return true i return false) adres URL jest obsługiwane przez mój aplikacji.

+1

Ten kod naprawdę daje żadnej wskazówki co różne zachowania są po powrocie inną wartość logiczną ponieważ dzwonisz view.loadUrl() w obu przypadkach, wytwarzając w ten sposób ten sam wynik. Jeśli usunąłeś tę linię z obu instrukcji, zobaczysz, że return false nadal ładuje URL w WebView ... i return true nic nie robi (musisz ręcznie coś zrobić). – Devunwired

Odpowiedz

22

Po utworzeniu i dołączyć WebViewClient do swojej WebView, zostały przesłonięte domyślne zachowanie gdzie Android pozwoli na ActivityManager przekazać URL do przeglądarki (ten występuje tylko wtedy, gdy nie ma klient jest ustawiony na widoku), patrz the docs on the method for more .

Po załączeniu WebViewClient, wracając fałszywy formularz shouldOverrideUrlLoading() przekazuje URL do WebView, wracając prawda mówi WebView robić nic ... bo aplikacja zajmie się nim. Niestety, żadna z tych ścieżek nie prowadzi do przekazania Androidowi adresu URL do przeglądarki. Coś jak to powinno rozwiązać problem:

@Override 
public boolean shouldOverrideUrlLoading(WebView view, String url) { 
    try { 
     URL urlObj = new URL(url); 
     if(TextUtils.equals(urlObj.getHost(),"192.168.1.34")) { 
     //Allow the WebView in your application to do its thing 
     return false; 
     } else { 
     //Pass it to the system, doesn't match your domain 
     Intent intent = new Intent(Intent.ACTION_VIEW); 
     intent.setData(Uri.parse(url)); 
     startActivity(intent); 
     //Tell the WebView you took care of it. 
     return true; 
     } 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Wiem, że wydaje się nieco sprzeczne z intuicją, jak można oczekiwać return false; całkowicie obejść WebView, ale to nie jest przypadek gdy używasz niestandardowego WebViewClient.

Nadzieję, że pomaga!

+0

Dzięki za kod, ale niestety to też nie działa. Wypróbowałem twój kod, zewnętrzna przeglądarka ładuje adres URL (www.example.org) zaraz po uruchomieniu aplikacji. – ace

+0

To brzmi bardziej jak problem z instrukcją if, która wybiera ścieżkę. Zaktualizowałem ten przykład teraz, gdy opublikowałeś kod, używając tego samego sprawdzenia, co zrobiłeś (oboje zakładamy, że instrukcja poprawnie ocenia twoje adresy URL). – Devunwired

+0

Witam, nadal nie działa. Ponownie zewnętrzna przeglądarka obsługuje adres URL bez względu na to, co jest przeciwieństwem mojego kodu. Wygląda na to, że google docs na tym – ace

5

Jeśli nie możesz sobie pozwolić na wyjaśnienie, co "nie działa poprawnie", oznacza to, że nie możemy zadać sobie trudu, aby udzielić Ci konkretnej pomocy.

Użyj shouldOverrideUrlLoading(). Sprawdź podany adres URL. Jeśli chcesz zachować numer WebView, zadzwoń pod numer loadUrl() pod adresem WebView z adresem URL i zwróć true. W przeciwnym razie zwróć false i pozwól, by Android obsługiwał to normalnie.

1

Dodaj poniższe linie do swojej działalności

@Override 
      public boolean shouldOverrideUrlLoading(WebView view, String url) { 
       if(Uri.parse(url).getHost().endsWith("192.168.1.34")) { 
        view.loadUrl(url); 
        Log.d("URL => ", url); // load URL in webview 
        return false; 
       } 

       Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
       view.getContext().startActivity(intent); // Pass it to the system, doesn't match your domain 
       return true; 
      } 
Powiązane problemy