Android WebView兼容性问题
- 问题表现
WebView中,自定义打开URL页面的操作,有些页面需要通过二级页面打开。通过shouldOverrideUrlLoading进行定义的:
mWebView.setWebViewClient(new WebViewClient(){
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
但是android 2.3.x(Android3.0以下)系列的机器 有个bug:自定义的webview截获不了,即shouldOverrideUrlLoading没有被调用。
解决方法
对Android版本进行适配。对于android 3.0以下版本,进行兼容性处理。对于android3.0以下版本放在shouldOverrideUrlLoading中的逻辑放在onPageStarted方法中去处理。举例说明
加载网页规则:
1)当前页面默认的URL地址 http://[myhost]/
2)同级页面跳转 以http://[myhost]开头,并且带有level=1参数的URL,在同一页面打开;
3)除此外,作为二级页面在新窗口或者作为OpenUrl处理。
webView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(final WebView view, final String url) {
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
//API < 11 shouldOverrideUrlLoading并不是每次都会调用
} else {
//API >= 11 shouldOverrideUrlLoading有效
handler.post(new Runnable() {
@Override
public void run() {
//2)JS连续调用出现问题采用线程队列处理
if (url.startsWith(Constants.PROTOCAL_HTTP)
&& url.contains(Constants.MAIN_HOST)
&& url.contains("level=1")) {
//网页加载兼容http和https
view.loadUrl(url);
} else {
//3)作为二级页面在新窗口或者作为OpenUrl处理
UriUtils.parseUri(MainFragment.this.getActivity(), url, handler);
}
}
});
}
return true;
}
@Override
public void onPageStarted(final WebView view, final String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
//API < 11 shouldOverrideUrlLoading并不是每次都会调用 处理移动到onPageStarted
handler.post(new Runnable() {
@Override
public void run() {
if( url.equals(Constants.API_URL_MAIN)
|| url.equals(Constants.API_HTTP_URL_MAIN)) {
//1)如果是默认URL继续加载
} else if (url.startsWith(Constants.PROTOCAL_HTTP)
&& url.contains(Constants.MAIN_HOST)
&& url.contains("level=1")) {
//2)同级页面跳转(网页加载兼容http和https)
} else {
//3)作为二级页面在新窗口或者作为OpenUrl处理
//停止加载新的网页URL
view.stopLoading();
//JS连续调用出现问题采用线程队列处理
UriUtils.parseUri(MainFragment.this.getActivity(), url, handler);
}
}
});
} else {
//API >= 11 shouldOverrideUrlLoading有效不需要URL处理
}
}
......
}
从上可见,在onPageStarted方法中去处理页面跳转逻辑稍微有些差异。