Ł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?

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.


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.

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

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

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ć.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.