使用Android WebView加载现有的.html文件


86

我确实尝试了以下示例,来自Google代码的演示以及其他资源 WebView,但是当我尝试用自己的代码进行操作时,它对我不起作用。

我想加载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文件吗?

Answers:


161

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

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

和, mWebView.loadUrl("file:///android_asset/myfile.html");可以在所有API级别下使用。

我仍然不知道为什么mWebView.loadUrl("file:///android_res/raw/myfile.html");只能在API级别8上工作。但是现在不重要了。


50
FWIW我不认为这是一个愚蠢的错误。我现在犯了同样的错误,两次。这不直观!首先创建一个名为“ assets”的文件夹,然后通过“ android_asset”引用它(没有“ s”)?这是愚蠢的平台,IMO:P
richtaur 2011年

3
到坏raw没有工作。我会用的raw-deraw-fr依此类推。现在我必须自己做。
马丁

我尝试了laph指导的相同方法,但是当我将xml文件放在您提到的文件夹中时,myWebView.loadUrl(“ file:///android_res/raw/myfile.xml”); 当我编写myWebView.loadUrl(“ file://android_res/raw/myfile.xml”)时,它给我一个错误,请确保互联网或路径正确。它没有给出任何错误,但也没有显示任何内容。请对此提供帮助。
Aditya1510 2011年

2
嗨,Aditya,我认为该错误是因为您的文件为.xml。loadUrl假设要加载.html文件。如果我错了,请纠正我。
laph

这可能吗?文件夹资产包含Javascript和其他文件,文件夹res / raw包含HTML文件
user2422690

17

将.html文件粘贴到项目文件夹的Assets文件夹中。并使用以下代码在布局文件夹中创建xml文件:my.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"
    />

在活动中添加以下代码

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.

16

如果您的结构应如下所示:

/assets/html/index.html

/assets/scripts/index.js

/assets/css/index.css

然后就做(Android WebView:处理方向更改

    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);
    }

然后只需使用网址

<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">

6

将.html文件复制并粘贴到Project的资产文件夹中,然后在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);

是我的三倍斜杠///
马克

2

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


嗨,卢乔,谢谢您的回答。您的意思是我必须将.html文件转换为String,然后使用loadData或loadDataWithBaseUrl方法加载它?
laph

2
我的.html文件很大,可以快速转换为字符串。有任何想法用绝对路径加载它吗?
laph

2

调试汇编是从不同的版本之一,因此:

考虑这样的Project文件结构[如果是Debug汇编,则为这种情况]:

src
  |
  debug
      |
      assets
           |
           index.html

您应该像这样将index.html调用到WebView中:

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

如此,对于Release组装,它应该像这样:

src
  |
  release
        |
        assets
             |
             index.html

波纹管结构也适用于两种编译[ debug and release ]:

src
  |
  main
     |
     assets
          |
          index.html
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.