为了让web上的富文本编辑后的html能够在手机的webview中适配显示,基本上只要设置了LayoutAlgorithm.SINGLE_COLUMN都能够解决(需要指定一个targetSdkVersion),但是发现某些手机,比如MX3上却无法适配,找了很多方法都没有效果,最终还是决定修改html页面来解决。
首先需要认清楚html上的图片宽高单位px并非手机分辨率的像素,有点类似dp的概率,只和视觉长度有关。在html中img的初始宽度都是根据图片的分辨率来设定的,但是在显示的时候它的宽度值却变成了相对标准比例的视觉宽度,比如宽度为900*600的图片在浏览器上显示不会超过屏幕的宽度,但是在手机上,不管手机的分辨率,它的视觉宽度是和浏览器上一样的,所以我们为了适配手机需要对比图片的在css中的宽度和device-width(相对浏览器非分辨率),如果超出了device-width就重新设置图片的宽度。
示例代码:
html
<meta name="viewport" content="width=device-width, initial-scale=1" />
<script type="text/javascript" src="file:///android_asset/jquery.js"></script>
<script type="text/javascript" src="file:///android_asset/handler.js"></script>
<body style="background-color: #eeeeee; padding: 0 1em;" >
<div style="text-align: center;">${title}</div>
<hr style="border:none;border-top:1px solid #dcdcdc;border-bottom:1px solid #ffffff;" />
${content}
</body>
handler.js
var ww = window.innerWidth;
$(function(){
$('body').css({'word-break':'break-all','width':'auto'});
$('span').css({'word-break':'break-all','width':'auto'});
});
window.onload = function() {
$('img').each(function(){
var width = $(this).css("width");
var rwidth=width.substring(0, width.length-2);
if(rwidth >= ww){
$(this).css("width",ww*0.9);
}
});
end.callback();
};
webView.addJavascriptInterface(new CallbackInterface(), "end");
webView.loadDataWithBaseURL(host, html, "text/html", "UTF_8", null);
值得注意的是设置了高版本的target后,需要为end.callback添加@JavascriptInterface后js才能找到,另外loadDataWithBaseURL的第一个参数baseUrl也需要注意,如果内容中的src没有包含host,baseUrl需要写host,并且html中引用的js路径也需要写绝对路径即file:///android_asset/jquery.js,如果内容没有要求baseUrl就可以直接写file:///android_asset/,这样js路径就可以写相对路径了。