【问题标题】:Loading existing .html file with android WebView使用 android WebView 加载现有的 .html 文件
【发布时间】:2011-04-30 23:21:23
【问题描述】:

我确实使用WebView 尝试了来自 Google 代码和其他资源的示例、演示,但是当我尝试在自己的代码中进行时,它对我不起作用。

我想加载我放在资产文件夹中的myfile.html,并使用:

private WebView myWebView;

myWebView.loadUrl("file:///android_assets/myfile.html");

在模拟器上显示错误

file:///android_assets/myfile.html 的网页无法访问 加载为:未找到请求的文件。 /android_assets/myfile.html

当我将该文件放入res/raw/ 文件夹并使用时:

myWebView.loadUrl("file:///android_res/raw/myfile.html");

那么可能只有模拟器 android 2.2 API 级别 8 可以加载文件,其他旧版本显示相同的错误。我错过了什么吗?

有没有办法在适用于所有 API 版本的应用程序包中加载现有的 .html 文件?

【问题讨论】:

    标签: android android-webview android-assets


    【解决方案1】:

    好吧,那是我非常愚蠢的错误。我在这里发布答案以防万一有人遇到同样的问题。

    资产文件夹中存储的文件的正确路径是file:///android_asset/*(资产文件夹没有“s”,我一直认为它必须有一个“s”)。

    而且,mWebView.loadUrl("file:///android_asset/myfile.html"); 可在所有 API 级别下工作。

    我仍然不明白为什么mWebView.loadUrl("file:///android_res/raw/myfile.html"); 仅适用于 API 级别 8。但现在没关系了。

    【讨论】:

    • FWIW 我不认为这是一个愚蠢的错误。我现在犯了同样的错误,两次。这不直观!首先创建一个名为“assets”的文件夹,然后通过“android_asset”(没有“s”)引用它??这是愚蠢的平台,IMO:P
    • 糟糕raw 没用。我会使用raw-deraw-fr等等。现在我必须自己做。
    • 我尝试了 laph 指导的相同方式,但是当我将我的 xml 文件放在你提到的文件夹中时 myWebView.loadUrl("file:///android_res/raw/myfile.xml");当我写 myWebView.loadUrl("file://android_res/raw/myfile.xml");它没有给出任何错误,但也没有显示任何内容。请帮助我。
    • 您好 Aditya,我认为错误是因为您的文件是 .xml。 loadUrl 假设加载一个 .html 文件。如果我错了,请纠正我。
    • 这可能吗?文件夹 assets 包含 Javascript 和其他文件,文件夹 res/raw 包含 HTML 文件
    【解决方案2】:

    如果你的结构应该是这样的:

    /assets/html/index.html

    /assets/scripts/index.js

    /assets/css/index.css

    那就做吧 (Android WebView: handling orientation changes)

        if(WebViewStateHolder.INSTANCE.getBundle() == null) { //this works only on single instance of webview, use a map with TAG if you need more
            webView.loadUrl("file:///android_asset/html/index.html");
        } else {
            webView.restoreState(WebViewStateHolder.INSTANCE.getBundle());
        }
    

    确保添加

        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
            webSettings.setAllowFileAccessFromFileURLs(true);
            webSettings.setAllowUniversalAccessFromFileURLs(true);
        }
    

    那么就使用url

    <html>
    <head>
        <meta charset="utf-8">
        <title>Zzzz</title>
        <script src="../scripts/index.js"></script>
        <link rel="stylesheet" type="text/css" href="../css/index.css">
    

    【讨论】:

      【解决方案3】:

      将您的 .html 文件粘贴到项目文件夹的 assets 文件夹中。 并使用 fol 代码在布局文件夹中创建一个 xml 文件: 我的.xml:

      <WebView  xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/webview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
          />
      

      在活动中添加fol代码

      setContentView(R.layout.my);
          WebView mWebView = null;
          mWebView = (WebView) findViewById(R.id.webview);
          mWebView.getSettings().setJavaScriptEnabled(true);
          mWebView.loadUrl("file:///android_asset/new.html"); //new.html is html file name.
      

      【讨论】:

        【解决方案4】:

        将您的 .html 文件复制并粘贴到项目的 assets 文件夹中,并在 onCreate() 上的 Activity 中添加以下代码。

                WebView view = new WebView(this);
                view.getSettings().setJavaScriptEnabled(true);
                view.loadUrl("file:///android_asset/**YOUR FILE NAME**.html");
                view.setBackgroundColor(Color.TRANSPARENT);
                setContentView(view);
        

        【讨论】:

        • 是三重斜线让我///
        【解决方案5】:

        您可以手动读取 html 文件,然后使用 WebView 的loadDataloadDataWithBaseUrl 方法来显示它。

        【讨论】:

        • 嗨 Lucho,感谢您的回答。你的意思是我必须将我的 .html 文件转换为字符串,然后用 loadData 或 loadDataWithBaseUrl 方法加载它?
        • 我的 .html 文件很大,可以快速转换为字符串。知道用绝对路径加载它吗?
        【解决方案6】:

        调试编译发布不同,所以:

        考虑你的项目文件结构[如果是调试汇编]:

        src
          |
          debug
              |
              assets
                   |
                   index.html
        

        您应该将 index.html 调用到您的 WebView 中,例如:

        web.loadUrl("file:///android_asset/index.html");
        

        以此类推,对于 Release 组装,它应该是这样的:

        src
          |
          release
                |
                assets
                     |
                     index.html
        

        波纹管结构也适用,两种编译方式 [调试和发布]:

        src
          |
          main
             |
             assets
                  |
                  index.html
        

        【讨论】:

          猜你喜欢
          • 2014-04-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-19
          • 2014-02-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多