Android WebView:网页不可用,但我从html字符串加载它

Android WebView:网页不可用,但我从html字符串加载它,android,android-webview,Android,Android Webview,我的html字符串如下所示: <meta http-equiv=\"Content-Type\" content=\"text/html\"; charset=\"UTF-8\" /> <p style="text-align: justify;"> paragraph </p> <p style="text-align: justify;"> another one with <strong> strong attr </p&g

我的html字符串如下所示:

<meta http-equiv=\"Content-Type\" content=\"text/html\"; charset=\"UTF-8\" />
<p style="text-align: justify;"> paragraph </p>
<p style="text-align: justify;"> another one with <strong> strong attr </p>
<p style="text-align: justify;"> in general p have <strong> strong</strong> and <em> em parts</em></p>
我有不同的html字符串,其中一些是可以的,但其他的给我这个错误…问题在哪里?

解决了,给我很多“有用”的答案,因为这真的是一个讨厌的webview错误,我想我的答案会帮助你们很多人

如果html页面确实包含“%”、“\”或“#”字符之一,loadData()方法将失败!! 因此,您必须手动替换这些chr,这是我的类:

public class BuglessWebView extends WebView{

public BuglessWebView(Context context) {
    super(context);
}

public BuglessWebView(Context context,AttributeSet attributes){
    super(context,attributes);
}

public BuglessWebView(Context context,AttributeSet attributes,int defStyles){
    super(context,attributes,defStyles);
}

@Override
public void loadData(String data, String mimeType, String encoding) {

    super.loadData(solveBug(data), mimeType, encoding);
}

private String solveBug(String data){
    StringBuilder sb = new StringBuilder(data.length()+100);
    char[] dataChars = data.toCharArray();

    for(int i=0;i<dataChars.length;i++){
        char ch = data.charAt(i);
        switch(ch){
        case '%':
            sb.append("%25");
            break;
        case '\'':
            sb.append("%27");
            break;
        case '#':
            sb.append("%23");
            break;
        default:
            sb.append(ch);
            break;
        }
    }

    return sb.toString();
}
}
公共类BuglesWebView扩展了WebView{
公共BuglesWebView(上下文){
超级(上下文);
}
公共BuglesWebView(上下文上下文、属性集属性){
超级(上下文、属性);
}
公共BuglesWebView(上下文上下文、属性集属性、int-defStyles){
超级(上下文、属性、定义样式);
}
@凌驾
公共void加载数据(字符串数据、字符串mimeType、字符串编码){
super.loadData(solveBug(data)、mimeType、编码);
}
私有字符串(字符串数据){
StringBuilder sb=新的StringBuilder(data.length()+100);
char[]dataChars=data.tocharray();

对于(inti=0;i使用loadDataWithBaseURL代替

 webView.loadDataWithBaseURL(null, html,"text/html", "UTF-8", null);
以下是具有此解决方法的讨论:

评论:#14和#18


在这里工作。

我刚刚遇到了这个问题,并且有很多相关的bug报告与之相关。我有一个%是我的内联CSS,导致页面无法呈现。当我在文档中看到

encoding参数指定数据是base64还是URL 编码。如果数据是base64编码的,则编码的值 参数必须为“base64”。对于该参数的所有其他值, 包括null,假设数据使用ASCII编码 安全URL字符范围内的八位字节,并使用标准 %超出该范围的八位字节的URL的xx十六进制编码。例如, “#”、“%”、“\”、“?”应替换为%23、%25、%27、%3f 分别

但是遗憾的是,按照指示使用
base64
并没有什么区别。在我的4.3设备上一切都很好,但在2.3上什么都不会呈现。查看所有的bug报告,每个人都提出了不同的建议,但唯一对我有效的是使用

webView.loadDataWithBaseURL(null,data.content,“text/html”,“UTF-8”,null);


小心不要使用
text/html;
而不是
text/html
,因为它会自动失败!

感谢您使用表达式“自动失败”。这使我能够在Google上找到此线程;此解决方法解决了我的问题!
 webView.loadDataWithBaseURL(null, html,"text/html", "UTF-8", null);