How to make links open within webview or open by default browser depending on domain name?

后端 未结 3 1554
梦毁少年i
梦毁少年i 2020-12-16 05:56

I have WebView in which I want to open links belong to domain www.example.org in webview while all other links (if clicked) open by the default browser outside of my applica

相关标签:
3条回答
  • 2020-12-16 06:35

    If you can't be bothered to explain what "does not work properly" means, we can't be bothered to give you much specific help.

    Use shouldOverrideUrlLoading(). Examine the supplied URL. If it is one you want to keep in the WebView, call loadUrl() on the WebView with the URL and return true. Otherwise, return false and let Android handle it normally.

    0 讨论(0)
  • 2020-12-16 06:51

    Once you create and attach a WebViewClient to your WebView, you have overridden the default behavior where Android will allow the ActivityManager to pass the URL to the browser (this only occurs when no client is set on the view), see the docs on the method for more.

    Once you have attached a WebViewClient, returning false form shouldOverrideUrlLoading() passes the url to the WebView, while returning true tells the WebView to do nothing...because your application will take care of it. Unfortunately, neither of those paths leads to letting Android pass the URL to the browser. Something like this should solve your issue:

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

    I know that seems a little counterintuitive as you would expect return false; to completely circumvent the WebView, but this is not the case once you are using a custom WebViewClient.

    Hope that helps!

    0 讨论(0)
  • 2020-12-16 06:52

    Add the following to your activity

    @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;
                }
    
    0 讨论(0)
提交回复
热议问题