使用自定义HTML和预定义的基本URL将CSS文件从资源加载到WebView

时间:2015-07-30 07:26:41

标签: android html css webview

我需要将我在运行时构建的一些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文件的?

1 个答案:

答案 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开始的请求。