Clicking URLs opens default browser

前端 未结 6 455
独厮守ぢ
独厮守ぢ 2020-11-22 13:09

I have loaded an external URL in my WebView. Now what I need is that when the user clicks on the links on the page loaded, it has to work like a normal browser

相关标签:
6条回答
  • 2020-11-22 13:19

    Official documentation says, click on a link in a WebView will launch application that handles URLs. You need to override this default behavior

        myWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                return false;
            }
        });
    

    or if there is no conditional logic in the method simply do this

    myWebView.setWebViewClient(new WebViewClient());
    
    0 讨论(0)
  • 2020-11-22 13:28

    Arulx Z's answer was exactly what I was looking for.

    I'm writing an app with Navigation Drawer with recyclerview and webviews, for keeping the web browsing inside the app regardless of hyperlinks clicked (thus not launching the external web browser). For that it will suffice to put the following 2 lines of code:

    mWebView.setWebChromeClient(new WebChromeClient()); mWebView.setWebViewClient(new WebViewClient());

    exactly under your WebView statement.

    Here's a example of my implemented WebView code:

    public class WebView1 extends AppCompatActivity {
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        WebView wv = (WebView) findViewById(R.id.wv1); //webview statement
        wv.setWebViewClient(new WebViewClient());    //the lines of code added
        wv.setWebChromeClient(new WebChromeClient()); //same as above
    
        wv.loadUrl("http://www.google.com");
    }}
    

    this way, every link clicked in the website will load inside your WebView. (Using Android Studio 1.2.2 with all SDK's updated)

    0 讨论(0)
  • 2020-11-22 13:29

    If you're using a WebView you'll have to intercept the clicks yourself if you don't want the default Android behaviour.

    You can monitor events in a WebView using a WebViewClient. The method you want is shouldOverrideUrlLoading(). This allows you to perform your own action when a particular URL is selected.

    You set the WebViewClient of your WebView using the setWebViewClient() method.

    If you look at the WebView sample in the SDK there's an example which does just what you want. It's as simple as:

    private class HelloWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    }
    
    0 讨论(0)
  • 2020-11-22 13:30

    Add this 2 lines in your code -

    mWebView.setWebChromeClient(new WebChromeClient()); 
    mWebView.setWebViewClient(new WebViewClient());
    
    0 讨论(0)
  • 2020-11-22 13:31

    in some cases you might need an override of onLoadResource if you get a redirect which doesn't trigger the url loading method. in this case i tried the following:

    @Override
    public void onLoadResource(WebView view, String url)
    {
        if (url.equals("http://redirectexample.com"))
        {
            //do your own thing here
        }
        else
        {
            super.onLoadResource(view, url);
        }           
    }
    
    0 讨论(0)
  • 2020-11-22 13:39

    The method boolean shouldOverrideUrlLoading(WebView view, String url) was deprecated in API 24. If you are supporting new devices you should use boolean shouldOverrideUrlLoading (WebView view, WebResourceRequest request).

    You can use both by doing something like this:

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        newsItem.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                view.loadUrl(request.getUrl().toString());
                return true;
            }
        });
    } else {
        newsItem.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });
    }
    
    0 讨论(0)
提交回复
热议问题