Laden einer vorhandenen HTML-Datei mit Android WebView


86

Ich habe Beispiele, Demos von Google-Codes und andere Ressourcen mit WebViewausprobiert, aber wenn ich versuche, dies in meinem eigenen Code zu tun, funktioniert es bei mir nicht.

Ich möchte laden, myfile.htmlwas ich in Assets-Ordner gelegt habe, und verwenden:

private WebView myWebView;

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

Am Emulator zeigt Fehler

Die Webseite unter file:///android_assets/myfile.htmlkonnte nicht geladen werden als: Die angeforderte Datei wurde nicht gefunden. /android_assets/myfile.html

Wenn ich diese Datei in einen res/raw/Ordner lege und benutze:

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

dann kann wahrscheinlich nur Emulator Android 2.2 API Level 8 die Datei laden, andere ältere Versionen zeigen den gleichen Fehler. Vermisse ich etwas

Gibt es eine Möglichkeit, eine vorhandene HTML-Datei in das Anwendungspaket zu laden, die auf allen API-Versionen funktioniert?

Antworten:


161

ok, das war mein sehr dummer fehler. Ich poste die Antwort hier für den Fall, dass jemand das gleiche Problem hat.

Der richtige Pfad für Dateien, die im Assets-Ordner gespeichert sind, ist file:///android_asset/*(ohne "s" für den Assets-Ordner, von dem ich immer dachte, dass er ein "s" haben muss).

Und mWebView.loadUrl("file:///android_asset/myfile.html");funktioniert unter allen API-Ebenen.

Ich mWebView.loadUrl("file:///android_res/raw/myfile.html");weiß immer noch nicht, warum es nur auf API-Ebene 8 funktioniert. Aber jetzt spielt es keine Rolle.


50
FWIW Ich glaube nicht, dass es ein dummer Fehler war. Ich habe jetzt zweimal den gleichen Fehler gemacht. Es ist nicht intuitiv! Erst einen Ordner mit dem Namen "Assets" erstellen und dann mit "android_asset" (no "s") darauf verweisen? Es ist die Plattform, die dumm ist, IMO: P
richtaur

3
schade rawhat nicht funktioniert. Ich würde die Verwendung für haben raw-de, raw-frund so weiter. Jetzt muss ich es selbst machen.
Martin

Ich habe den gleichen Weg versucht, der von Laph geleitet wurde, aber als ich meine XML-Datei in den von Ihnen erwähnten Ordner legte, myWebView.loadUrl ("file: ///android_res/raw/myfile.xml"); Es gibt mir den Fehler, dass Internet oder Pfad korrekt sind und wenn ich myWebView.loadUrl schreibe ("file: //android_res/raw/myfile.xml"); Es gibt keinen Fehler, aber es zeigt auch nichts. Bitte helfen Sie mir dabei.
Aditya1510

2
Hallo Aditya, ich glaube, dieser Fehler liegt daran, dass Ihre Datei .xml ist. loadUrl nimmt an, eine HTML-Datei zu laden. Bitte korrigieren Sie mich, wenn ich falsch liege.
Laph

Ist das möglich? Ordner Assets enthält Javascript und andere Dateien, Ordner res / raw enthält HTML-Dateien
user2422690

17

Fügen Sie Ihre HTML-Datei in den Assets-Ordner Ihres Projektordners ein. und erstellen Sie eine XML-Datei im Layout-Ordner mit dem folgenden Code: 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"
    />

Fol-Code in Aktivität hinzufügen

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

Wenn Ihre Struktur so aussehen sollte:

/assets/html/index.html

/assets/scripts/index.js

/assets/css/index.css

Dann machen Sie es einfach ( Android WebView: Orientierungsänderungen behandeln )

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

Stellen Sie sicher, dass Sie hinzufügen

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

Dann benutze einfach URLs

<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

Kopieren Sie Ihre HTML-Datei, fügen Sie sie in den Assets-Ordner Ihres Projekts ein und fügen Sie den folgenden Code in Ihre Aktivität auf onCreate () ein.

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

es war der dreifache Schrägstrich, der mich /// brachte
Marc

2

Sie können die HTML-Datei manuell lesen und dann loadDataoder loadDataWithBaseUrlMethoden von WebView verwenden, um sie anzuzeigen.


Hallo Lucho, danke für deine Antwort. Sie meinen, ich muss meine HTML-Datei in einen String konvertieren und sie dann mit der Methode loadData oder loadDataWithBaseUrl laden?
Laph

2
Meine HTML-Dateien sind ziemlich groß, um schnell in Zeichenfolgen konvertiert zu werden. Irgendeine Idee, es mit absolutem Pfad zu laden?
Laph

2

Die Debug - Zusammenstellung unterscheidet sich von der Freigabe ein, so:

Betrachten Sie Ihre Projektdateistruktur folgendermaßen [in diesem Fall für ein Debug-Assemble ]:

src
  |
  debug
      |
      assets
           |
           index.html

Sie sollten index.html in Ihrem WebView wie folgt aufrufen:

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

Für das Release-Assemble sollte es also so aussehen:

src
  |
  release
        |
        assets
             |
             index.html

Die folgende Struktur funktioniert auch für beide Kompilierungen [ Debug und Release ]:

src
  |
  main
     |
     assets
          |
          index.html
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.