Ładowanie istniejącego pliku .html za pomocą Android WebView

87

Próbowałem próbek, demonstracji z kodów Google i innych zasobów WebView, ale kiedy próbuję to zrobić we własnym kodzie, nie działa to dla mnie.

Chcę załadować to, myfile.htmlco umieściłem w folderze zasobów i używając:

private WebView myWebView;

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

Na emulatorze pokazuje błąd

file:///android_assets/myfile.htmlNie można załadować strony internetowej pod adresem : Żądany plik nie został znaleziony. /android_assets/myfile.html

Kiedy umieszczam ten plik w res/raw/folderze i używam:

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

wtedy prawdopodobnie tylko emulator Android 2.2 API level 8 może załadować plik, inne starsze wersje pokazują ten sam błąd. Czy coś mi brakuje?

Czy istnieje sposób na załadowanie istniejącego pliku .html w pakiecie aplikacji, który działa na wszystkich wersjach API?

laph
źródło

Odpowiedzi:

161

ok, to był mój bardzo głupi błąd. Tutaj zamieszczam odpowiedź na wypadek, gdyby ktoś miał ten sam problem.

Prawidłowa ścieżka do plików przechowywanych w folderze zasobów to file:///android_asset/*(bez „s” dla folderu zasobów, który zawsze myślałem, że musi mieć „s”).

I mWebView.loadUrl("file:///android_asset/myfile.html");działa w każdych poziomach API.

Nadal nie rozumiem, dlaczego mWebView.loadUrl("file:///android_res/raw/myfile.html");działa tylko na poziomie API 8. Ale teraz to nie ma znaczenia.

laph
źródło
50
FWIW Nie sądzę, żeby to był głupi błąd. Teraz dwukrotnie popełniłem ten sam błąd. To nie jest intuicyjne! Najpierw utwórz folder o nazwie „asset”, a następnie odwołaj się do niego za pomocą „android_asset” (bez „s”) ?? To platforma, która jest głupia, IMO: P
richtaur
3
źle rawnie działało. Chciałbym mieć zastosowanie dla raw-de, raw-fri tak dalej. Teraz muszę to zrobić sam.
Martin
próbowałem w ten sam sposób kierując się laph, ale kiedy umieściłem mój plik xml w wymienionym przez Ciebie folderze myWebView.loadUrl ("file: ///android_res/raw/myfile.xml"); Daje mi błąd, że upewnij się, że Internet lub ścieżka jest poprawna i kiedy piszę myWebView.loadUrl ("file: //android_res/raw/myfile.xml"); nie daje żadnego błędu ale też nic nie pokazuje, pomóż mi w tym.
Aditya1510
2
Cześć Aditya, uważam, że ten błąd jest spowodowany tym, że plik jest .xml. loadUrl zakłada załadowanie pliku .html. Proszę popraw mnie jeżeli się mylę.
laph
czy to możliwe? Zasoby folderów zawierają Javascript i inne pliki, folder res / raw zawiera pliki HTML
user2422690
17

wklej plik .html do folderu zasobów w folderze projektu. i utwórz plik xml w folderze układu z poniższym kodem: 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"
    />

dodaj kod fol w aktywności

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.
Naresh
źródło
17

Jeśli twoja struktura powinna wyglądać następująco:

/assets/html/index.html

/assets/scripts/index.js

/assets/css/index.css

Następnie po prostu zrób ( Android WebView: obsługa zmian orientacji )

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

Upewnij się, że dodałeś

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

Następnie po prostu użyj adresów 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">
EpicPandaForce
źródło
6

Skopiuj i wklej swój plik .html w folderze zasobów projektu i dodaj poniższy kod do swojej aktywności onCreate ().

        WebView view = new WebView(this);
        view.getSettings().setJavaScriptEnabled(true);
        view.loadUrl("file:///android_asset/**YOUR FILE NAME**.html");
        view.setBackgroundColor(Color.TRANSPARENT);
        setContentView(view);
Arunkumar
źródło
to potrójne cięcie doprowadziło mnie ///
Marc
2

Możesz odczytać plik html ręcznie, a następnie użyć loadDatalub loadDataWithBaseUrlmetod WebView, aby go wyświetlić.

Lachezar
źródło
Cześć Lucho, dziękuję za odpowiedź. Oznacza to, że muszę przekonwertować mój plik .html na String, a następnie załadować go metodą loadData lub loadDataWithBaseUrl?
laph
2
moje pliki .html są dość duże, aby szybko przekształcić je w ciąg. Każdy pomysł, aby załadować go ścieżką bezwzględną?
laph
2

Kompilacja debugowania różni się od uwalniania jednego, więc:

Rozważ taką strukturę pliku projektu [w tym przypadku w przypadku zestawu do debugowania ]:

src
  |
  debug
      |
      assets
           |
           index.html

Powinieneś wywołać index.html w swoim WebView na przykład:

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

Tak więc, w przypadku zespołu wydania, powinno wyglądać następująco:

src
  |
  release
        |
        assets
             |
             index.html

Poniższa struktura działa również dla obu kompilacji [ debugowania i wydania ]:

src
  |
  main
     |
     assets
          |
          index.html
PYK
źródło