我需要将我在运行时构建的一些HTML加载到WebView中,并将应用CSS文件加载到放置在assets目录中。我已经有一个基本网址,我需要提供给网页视图的loadDataWithBaseURL
功能。
代码段(不应用CSS文件):
StringBuffer buff = new StringBuffer();
buff.append("<head>");
buff.append("<link rel=\"stylesheet\" type=\"text/css\" href=\"file:///android_asset/my_css_file.css\"/>");
buff.append("</head>");
buff.append("<div class=\"announcement-header\">");
buff.append("HEADER");
buff.append("</div>");
buff.append("<div class=\"announcement-separator\"></div>");
buff.append("<div class=\"announcement\">");
buff.append("CONTENT");
buff.append("</div>")
WebView.loadDataWithBaseURL(MY_BASE_URL, buff.toString(), "text/html", HTTP.UTF_8, null);
我已经看过这两个类似问题Issue 1&amp; Issue 2,但我的情况略有不同,因为我无法将file:///android_asset/
作为loadDataWithBaseURL
函数的基本网址。
在这种情况下我是如何应用CSS文件的?
答案 0 :(得分:1)
如果您想拦截来自WebView
的某些请求,可以通过覆盖shouldInterceptRequest()
中的WebViewClient
来完成此操作:
public WebResourceResponse shouldInterceptRequest (final WebView view, String url) {
if (URLUtil.isFileUrl(url) && url.contains(".css")) {
return getCssWebResourceResponseFromAsset();
} else {
return super.shouldInterceptRequest(view, url);
}
}
这里已有一个非常详细的答案https://stackoverflow.com/a/8274881/1112882
<强>无论其强> 如果由于安全原因您的基本网址不是本地网址,则无法访问本地文件。所以给你的css提供相对路径然后拦截请求。
我建议使用模式来区分实际的相对路径和自定义相对路径。例如使用android_asset/my_css_file.css
代替my_css_file.css
并相应修改shouldInterceptRequest()
,以便始终拦截从android_asset
开始的请求。