您的位置:首页 > 移动开发

Android WebView兼容性问题

2016-04-01 18:50 579 查看

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方法中去处理页面跳转逻辑稍微有些差异。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: