安卓 WebView 从 assets 中加载 JavaScript

27
如何使远程HTML页面上的JavaScript和图片从资源文件夹(或本地任何资源)加载?
2个回答

45

回答:
1. 你必须把HTML加载到字符串中:

private String readHtml(String remoteUrl) {
    String out = "";
    BufferedReader in = null;
    try {
        URL url = new URL(remoteUrl);
        in = new BufferedReader(new InputStreamReader(url.openStream()));
        String str;
        while ((str = in.readLine()) != null) {
            out += str;
        }
    } catch (MalformedURLException e) { 
    } catch (IOException e) { 
    } finally {
        if (in != null) {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return out;
}


2. 使用基本URL加载WebView:

String html = readHtml("http://mydomain.com/my.html");
mWebView.loadDataWithBaseURL("file:///android_asset/", html, "text/html", "utf-8", "");
在这种特定情况下,您应该让所有想要在页面上使用的 .js 文件都驻留在项目的 "assets" 文件夹下的某个位置。例如:
/MyProject/assets/jquery.min.js
在您的远程HTML页面中,您需要加载存储在应用程序中的.js和.css文件,例如:
<script src="file:///android_asset/jquery.min.js" type="text/javascript"></script>

对于所有其他本地资源(如图像等),同样适用。它们的路径必须以

开头。

file:///android_asset/

WebView首先会加载您提供的原始HTML字符串,然后会选择.js、.css和其他本地资源,最后会加载远程内容。


5
如果您使用loadDataWithBaseURL设置了基础路径,为什么还需要提供绝对路径呢?此外,似乎在4.1版本以上出现问题。 - Maarten
这在 4.1+ 版本对我有效,目前这是我所知道的唯一一种加载非硬编码到 assets 文件夹中 HTML 的方法。 - Chris
在这个解决方案中,如果网页包含图像,则不会加载任何图像。 - Igor K
我们如何在postURL方法中实现这个功能? - Karacago
仍然无法在 WebView 上使用 HTML 加载 JavaScript。我的 index.html(包含对 index.js 文件的引用)位于 asset/www/ 文件夹中(与 index.js 文件所在的位置相同)。我正在尝试将我的 index.html 转换为字符串,但似乎它不起作用。readHtml 的返回值始终为 ""。我做错了什么?! - McLan
显示剩余2条评论

2
如果动态创建 HTML,并使用 loadDataWithBaseURL,请确保在 HTML 中引用您资产文件夹中的任何本地资源(如 JavaScript)时,将其指定为 file:///。否则你会像我一样浪费数小时来解决这个问题。

请您详细告诉我如何在将HTML作为字符串获取后,动态地添加(file://)路径到.js文件中。 - Adi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接