Webview加载html片段时一般有两种方法:
1 loadData()方法,使用此方法有两个问题,一个是加载页面出现乱码问题,一个是加载的页面无法和webview交互(我推测是编码导致的html源码数据格式出现问题,以至于找不到js的方法导致的)loadData(data, "text/html;charset=UTF-8",null);
此种方法可解决编码问题亲测有效。至于交互问题,可参考此篇博客可使用下边方法
final String digits = "0123456789ABCDEF";
public String encode(String s){
// Guess a bit bigger for encoded form
StringBuilder buf = new StringBuilder(s.length() + 16);
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')
|| (ch >= '0' && ch <= '9') || ".-*_".indexOf(ch) > -1) { //$NON-NLS-1$
buf.append(ch);
} else {
byte[] bytes = new String(new char[] { ch }).getBytes();
for (int j = 0; j < bytes.length; j++) {
buf.append('%');
buf.append(digits.charAt((bytes[j] & 0xf0) >> 4));
buf.append(digits.charAt(bytes[j] & 0xf));
}
}
}
return buf.toString();
}
最后综合起来就是loadData(encode(data), "text/html;charset=UTF-8",null);
以上是亲测有效果
2 loadDataWithBaseURL方式加载
xxxxx
loadDataWithBaseURL (String baseUrl, String data, String mimeType, String encoding, String historyUrl)
之前一直搞不明白baseUrl这个参数到底是干嘛的,直到一天忽然在网上看到一篇帖子,用处在于,有些h5代码片段中,有些地址使用的是相对路径比如src='/uploads/allimg/130923/1FP02V7-0.png'
如果baseUrl此参数不传或者为空的话,这张图片就无法显示,所以baseUrl为此图片地址的前缀http://www.xxxxx.com。
此种方式没有字符乱码问题,不过点击网页链接,跳转到子页面之后点击h5返回到上一个页面之后,会显示空白,网上说是本地的html文件无法添加到历史记录中,需要手动实现,暂时还没有找到好的解决办法,希望有小伙伴知道的能指点,不胜感激!
3 loadDataWithBaseURL 方式加载踩到的坑
当使用loadDataWithBaseURL 加载html源码的时候在个别手机上会出现webview无法加载数据的情况但是使用loadurl方式加载就没问题,经过几次尝试查找相关资料,确定是因为Android 系统会有一个叫Android System Webview的apk属于系统级应用,可以更新,当系统webview版本在63以上的时候就会出现webview加载异常的问题。目前测试了几个机型,三星手机的出现率最高。猜想大概是因为系统webview内部的加载源码的方法做了修改或者限制,webview的兼容性本身做的就差,目前我的解决办法是替换掉系统webview的内核,使用三方webview加载,目前使用的是腾讯的TBS,问题解决