Android WebView兼容性问题

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方法中去处理页面跳转逻辑稍微有些差异。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值