使用WebView时的一些坑(图片拼接、不显示、shouldOverrideUrlLoading正确用法)

来源:互联网 发布:js闭包坏处 编辑:程序博客网 时间:2024/05/01 12:35

开始学习WebView时感觉很简单,就是拿到控件后给他个URL就OK啦,但是在项目中真正用的时候,会有各种问题。

问题1:

如果URL的内容是一个个图片拼接的,会出现图片折叠的现象
这里写图片描述

原因:没有对WebView进行适配,只需要几行代码就OK

/***LayoutAlgorithm是一个枚举,用来控制html的布局,总共有三种类型:*NORMAL:正常显示,没有渲染变化。*SINGLE_COLUMN:把所有内容放到WebView组件等宽的一列中。这个是强制的,把网页都挤变形了*NARROW_COLUMNS:可能的话,使所有列的宽度不超过屏幕宽度。*/ webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL); //设置webview推荐使用的窗口,设置为true webSettings.setUseWideViewPort(true); //设置webview加载的页面的模式,也设置为true。这方法可以让你的页面适应手机屏幕的分辨率,完整的显示在屏幕上,可以放大缩小。 webSettings.setLoadWithOverviewMode(true);

参考博客

问题2:

加载WebView时个别图片无法显示

参考博客

我设置了如下的属性:

webView.getSettings().setDomStorageEnabled(true); 

知识补充:

1)若没有设置 WebViewClient 则在点击链接之后由系统处理该 url,通常是使用浏览器打开或弹出浏览器选择对话框。(如果想要自己处理URL需要重写方法shouldOverrideUrlLoading )

2)若设置WebViewClient 且该方法返回 true ,则说明由应用的代码处理该 url,WebView 不处理。

3)若设置 WebViewClient 且该方法返回 false,则说明由 WebView 处理该 url,即用 WebView 加载该 url。

再结合 shouldOverrideUrlLoading 方法源码就可以得出上面图片中的结论,其实我们没必要自定义 WebViewClient 并重写其 shouldOverrideUrlLoading 方法,因为 WebViewClient 源码中 shouldOverrideUrlLoading 方法已经返回 false,也就是说只要你设置了 WebViewClient 就可以实现在WebView 中加载新的链接而不去调用浏览器加载。

这里写图片描述

参考文档

例子:

如果加载的URL中返回的URL包括想要的内容就跳到商详页

webView.setWebViewClient(new WebViewClient() {            @Override            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {                // TODO 加载失败的处理                dismissProgress();                super.onReceivedError(view, request, error);            }            @Override            public void onPageFinished(WebView view, String url) {                dismissProgress();                super.onPageFinished(view, url);            }            @Override            public boolean shouldOverrideUrlLoading(WebView view, String url) {                if (url.contains(PRODUCT_LINK)) {                    Uri uri = Uri.parse(url);                    long productId = Long.parseLong(uri.getQueryParameter("product_id"));                    Intent intent = new Intent(WebViewActivity.this, ProductDetailActivity.class);                    intent.putExtra(ConstantKeys.PRODUCT_ID, productId);                    startActivity(intent);                    return true;                }                return super.shouldOverrideUrlLoading(view, url);            }        });

WebViewClient 处理跳转URL(二次跳转)

1 0
原创粉丝点击