Как сделать ссылки открытыми в веб-браузере или открывать браузер по умолчанию в зависимости от имени домена? - PullRequest
5 голосов
/ 05 февраля 2011

У меня есть WebView, в котором я хочу открыть ссылки, принадлежащие домену www.example.org в веб-просмотре, в то время как все другие ссылки (при щелчке) открываются браузером по умолчанию вне моего приложения.

Я пытался использовать публичный логический shouldOverrideUrlLoading (представление WebView, URL-адрес строки), но он не работает должным образом.

Вот код, который не работает:

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) {

                   }
               }
}

В обоих случаях (верните true и верните false) URL обрабатывается моим приложением.

Ответы [ 3 ]

22 голосов
/ 05 февраля 2011

После создания и присоединения WebViewClient к WebView вы изменили поведение по умолчанию, при котором Android позволяет ActivityManager передавать URL-адрес в браузер (это происходит только в том случае, если в представлении не установлен клиент) см. документы по методу для более .

После того как вы прикрепите WebViewClient, возвращая ложную форму shouldOverrideUrlLoading(), передает URL-адрес WebView, в то время как возвращение true говорит WebView ничего не делать ... потому что ваше приложение позаботится об этом. К сожалению, ни один из этих путей не позволяет Android передавать URL-адрес в браузер. Примерно так должно решить вашу проблему:

@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();
    }
}

Я знаю, что это кажется немного нелогичным, поскольку вы ожидаете, что return false; полностью обойдет WebView, но это не тот случай, когда вы используете пользовательский WebViewClient.

Надеюсь, это поможет!

5 голосов
/ 05 февраля 2011

Если вы не можете объяснить, что означает «не работает должным образом», мы не сможем оказать вам особую помощь.

Используйте shouldOverrideUrlLoading(). Изучите предоставленный URL. Если это тот, который вы хотите оставить в WebView, позвоните loadUrl() на WebView с URL и верните true. В противном случае верните false и дайте Android нормально с этим справиться.

1 голос
/ 19 октября 2016

Добавьте следующее к своей деятельности

@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;
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...