方法原型
shouldOverrideUrlLoading(WebView view, String url)
此方法已经被标记为废弃,方法的第二个参数类型为String,在Android 7.0以下系统被调用
/**
* @param view The WebView that is initiating the callback.
* @param url The URL to be loaded.
* @return {@code true} to cancel the current load, otherwise return {@code false}.
* @deprecated Use {@link #shouldOverrideUrlLoading(WebView, WebResourceRequest)
* shouldOverrideUrlLoading(WebView, WebResourceRequest)} instead.
*/
@Deprecated
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
-
shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
此方法的第二个参数类型为WebResourceRequest ,在Android 7.0及以上系统被调用,此方法又调用了上面的方法。
/**
* @param view The WebView that is initiating the callback.
* @param request Object containing the details of the request.
* @return {@code true} to cancel the current load, otherwise return {@code false}.
*/
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return shouldOverrideUrlLoading(view, request.getUrl().toString());
}
因此在Android 7.0以下系统,如果我们设置了WebViewClient
,只有shouldOverrideUrlLoading(WebView view, String url)
方法会被调用,在Android 7.0及以上系统shouldOverrideUrlLoading(WebView view, String url)
和shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
两个方法都会被调用。
方法说明
/**
* Give the host application a chance to take control when a URL is about to be loaded in the
* current WebView. If a WebViewClient is not provided, by default WebView will ask Activity
* Manager to choose the proper handler for the URL. If a WebViewClient is provided, returning
* {@code true} causes the current WebView to abort loading the URL, while returning
* {@code false} causes the WebView to continue loading the URL as usual.
*
* <p class="note"><b>Note:</b> Do not call {@link WebView#loadUrl(String)} with the same
* URL and then return {@code true}. This unnecessarily cancels the current load and starts a
* new load with the same URL. The correct way to continue loading a given URL is to simply
* return {@code false}, without calling {@link WebView#loadUrl(String)}.
*
* <p class="note"><b>Note:</b> This method is not called for POST requests.
*
* <p class="note"><b>Note:</b> This method may be called for subframes and with non-HTTP(S)
* schemes; calling {@link WebView#loadUrl(String)} with such a URL will fail.
*/
以上语句引自于android.webkit.WebViewClient
类,翻译总结一下就是:
- 该方法给应用程序提供时机,让其控制当前的
WebView
是否继续加载相应的URL
。 - 如果应用程序没有提供
WebViewClient
,默认情况下WebView
会询问系统选择合适的程序处理URL
。如果提供了WebViewClient
,返回值为true
导致当前WebView
中止加载URL,返回false
导致WebView
继续加载当前URL
。 - 继续加载给定URL的正确方法是简单地返回
false
,不需要调用WebView.loadUrl(String)
,然后返回true
。
因此阻止WebView
调用系统浏览器只需要设置WebViewClient
,然后返回false
即可。
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
});
网友评论