Common Mistake of WebViewClient shouldOverrideUrlLoading
需求描述
在使用 WebView 的项目中,一个常见的需求是将页面内的链接跳转限制在 WebView 内,而不是使用外部浏览器打开,但 WebView 的默认行为是将链接点击事件作为 Intent 发送给系统,由系统决定如何处理(通常的行为是使用浏览器打开或是弹出浏览器选择对话框),那么如何实现期望的效果呢?
实现方案
文章关于用WebView或手机浏览器打开连接问题给出了一种使用 WebViewClient#shouldOverrideUrlLoading方法的方案可以达到效果,但其使用该方法的方式是错误的,且被广泛传播。因此,有必要在此澄清一下。
WebView#shouldOverrideUrlLoading 的 api doc 如下
1 2 3 4 5 6 7 8 9 10 | |
翻译一下,三种情况:
- 若没有设置
WebViewClient则在点击链接之后由系统处理该 url,通常是使用浏览器打开或弹出浏览器选择对话框。 - 若设置
WebViewClient且该方法返回 true ,则说明由应用的代码处理该 url,WebView不处理。 - 若设置
WebViewClient且该方法返回 false,则说明由WebView处理该 url,即用WebView加载该 url。
因此,开篇的需求使用如下方法即可实现:
设置
WebViewClient且在其shouldOverrideUrlLoading方法返回 false
示例程序见 WebViewClientTest