首先,我要说这只是 Android 2 及更早版本上的一个问题(4 似乎不受影响,我没有测试 3)。
我有一个 WebView
从字符串加载 html。 HTML 看起来像这样:
<html>
<head>
<link rel='stylesheet' type='text/css' href='http://www.robotsidekick.com/test.css?rev=0' />
</head>
<body>
<h1>Hello World</h1>
</body>
</html>
你可以看到css文件是这样的:
body {
font-family: "Lucida Console", "Lucida Sans Typewriter", Monaco, "Bitstream Vera Sans Mono", monospace;
}
h1 {
border-bottom: 3px solid #ccc;
}
WebView
代码如下所示:
final WebView webview = new WebView(this);
setContentView(webview);
final String result = "<html><head><link rel='stylesheet' type='text/css' href='http://www.robotsidekick.com/test.css?rev=0' /></head><body><h1>Hello World</h1></body></html>";
webview.loadData(result, "text/html", Encoding.UTF_8.toString());
发生了什么
我在 WebView
中看到了 html 代码就好像我将 MIME 类型设置为纯文本一样。
我的期望(以及 Android 4.x 中会发生什么
我在 WebView
中看到了 html
有几件事必须是真实的才能显示我所看到的症状:
- Android 2.x(我使用的是 2.3.7 和 2.2)
- 必须通过 url 访问 css
href="http://www.robotsidekick.com/test.css?rev=0"
而不是href="test.css"
(然而,如果它是一个真正的 css 文件并不重要href="http://www.thisisnotarealurl.fake/test.css?rev=0
会导致同样的问题) - css 必须有一个 get 参数
?rev=0
, 但它是什么并不重要
还想注意以下内容没有区别:
- 使用适当的
"
而不是'
在 HTML 中 - 拥有
link
标签是否自行关闭 - CSS 的内容
- 添加文档类型
<!DOCTYPE html>
到 HTML
最佳答案
将 webview.loadData
行更改为:
webview.loadData(URLEncoder.encode(result).replaceAll("\\+", " "), "text/html", Encoding.UTF_8.toString());
解决了这个问题。在我看来,带有未编码 ?
的相对路径不会导致问题,而带有未编码 ?
的假 url 确实会导致问题,这对我来说似乎很奇怪。
还觉得奇怪的是 WebView
在后续的 Android 版本中发生了足够大的变化,以至于我们不必再对 html 进行编码了吗?这听起来很可疑。
关于Android WebView 显示纯文本而不是 html,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13976193/