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

开始学习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(二次跳转)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要替换网页内的图片,你需要在 Android 的 WebView使用 WebViewClient 的 onPageFinished() 方法来实现。具体步骤如下: 1. 创建一个类继承自 WebViewClient,并重写其中的 onPageFinished() 方法。 2. 在 onPageFinished() 方法中,获取 WebView 中的 HTML 内容,然后使用正则表达式来匹配网页中的图片标签。 3. 对于每个匹配到的图片标签,使用 Android 的本地文件系统读取对应的本地图片文件,然后将其转换为 Base64 编码的字符串。 4. 使用 JavaScript 来替换网页中的图片标签,将其替换为包含 Base64 编码字符串的 data URI。 下面是示例代码: ```java public class MyWebViewClient extends WebViewClient { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); String javascript = "javascript:(function() {" + "var imgs = document.getElementsByTagName('img');" + "for (var i = 0; i < imgs.length; i++) {" + "var img = imgs[i];" + "var url = img.src;" + "if (url.startsWith('http')) {" + "var xhr = new XMLHttpRequest();" + "xhr.open('GET', url, true);" + "xhr.responseType = 'arraybuffer';" + "xhr.onload = function() {" + "if (xhr.status === 200) {" + "var uInt8Array = new Uint8Array(xhr.response);" + "var i = uInt8Array.length;" + "var binaryString = new Array(i);" + "while (i--) {" + "binaryString[i] = String.fromCharCode(uInt8Array[i]);" + "}" + "var data = binaryString.join('');" + "var base64 = window.btoa(data);" + "img.src = 'data:image/png;base64,' + base64;" + "}" + "};" + "xhr.send();" + "}" + "}" + "})()"; view.loadUrl(javascript); } } ``` 这段代码会在 WebView 加载网页完成后,使用 JavaScript 来替换所有 HTTP 开头的图片链接为对应的 Base64 编码字符串。你需要将图片的本地路径替换为对应的路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值