Chargement du fichier .html existant avec Android WebView


86

J'ai essayé des exemples, des démos de codes Google et d'autres ressources avec WebView, mais lorsque j'essaie de le faire dans mon propre code, cela ne fonctionne pas pour moi.

Je veux charger myfile.htmlce que j'ai mis dans le dossier des actifs et en utilisant:

private WebView myWebView;

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

Sur l'émulateur affiche une erreur

file:///android_assets/myfile.htmlImpossible de charger la page Web à l'adresse: Le fichier demandé est introuvable. /android_assets/myfile.html

Lorsque je place ce fichier dans un res/raw/dossier et que j'utilise:

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

alors seul l'émulateur Android 2.2 API niveau 8 peut charger le fichier probablement, d'autres versions plus anciennes montrent la même erreur. Est-ce que je manque quelque chose?

Existe-t-il un moyen de charger un fichier .html existant dans le package d'application qui fonctionne sur toutes les versions d'API?

Réponses:


161

ok, c'était ma très stupide erreur. Je poste la réponse ici juste au cas où quelqu'un aurait le même problème.

Le chemin correct pour les fichiers stockés dans le dossier des actifs est file:///android_asset/*(sans "s" pour le dossier des actifs dont je pensais toujours qu'il doit avoir un "s").

Et mWebView.loadUrl("file:///android_asset/myfile.html");fonctionne sous tous les niveaux d'API.

Je ne comprends toujours pas pourquoi mWebView.loadUrl("file:///android_res/raw/myfile.html");fonctionne uniquement au niveau de l'API 8. Mais cela n'a pas d'importance maintenant.


50
FWIW Je ne pense pas que ce soit une erreur stupide. J'ai fait la même erreur maintenant, deux fois. Ce n'est pas intuitif! Commencez par créer un dossier appelé "assets" puis faites-y référence par "android_asset" (pas de "s") ?? C'est la plate-forme qui est stupide, IMO: P
richtaur

3
à mauvais rawn'a pas fonctionné. J'aurais utilisé pour raw-de, raw-fret ainsi de suite. Maintenant, je dois le faire moi-même.
Martin le

j'ai essayé de la même manière guidé par laph mais quand j'ai mis mon fichier xml dans le dossier mentionné par vous myWebView.loadUrl ("file: ///android_res/raw/myfile.xml"); Cela me donne une erreur qui s'assure qu'Internet ou le chemin est correct et quand j'écris myWebView.loadUrl ("file: //android_res/raw/myfile.xml"); il ne donne aucune erreur mais il ne montre rien non plus. S'il vous plaît, aidez-moi.
Aditya1510

2
Salut Aditya, je crois que cette erreur est due au fait que votre fichier est .xml. loadUrl suppose de charger un fichier .html. Corrigez-moi si j'ai tort, s'il-vous plait.
laph

Est-ce possible? Les ressources du dossier contiennent du Javascript et d'autres fichiers, le dossier res / raw contient des fichiers HTML
user2422690

17

collez votre fichier .html dans le dossier assets de votre dossier de projet. et créez un fichier xml dans le dossier layout avec le code fol: 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"
    />

ajouter du code fol dans l'activité

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

Si votre structure doit être comme ceci:

/assets/html/index.html

/assets/scripts/index.js

/assets/css/index.css

Ensuite, faites simplement ( Android WebView: gestion des changements d'orientation )

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

Assurez-vous d'ajouter

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

Ensuite, utilisez simplement les 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

Copiez et collez votre fichier .html dans le dossier des ressources de votre projet et ajoutez le code ci-dessous dans votre activité sur 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);

c'est le triple slash qui m'a eu ///
Marc

2

Vous pouvez lire le fichier html manuellement, puis utiliser les méthodes loadDataou loadDataWithBaseUrlde WebView pour l'afficher.


Salut Lucho, merci pour votre réponse. Vous voulez dire que je dois convertir mon fichier .html en chaîne, puis le charger avec la méthode loadData ou loadDataWithBaseUrl?
laph du

2
mes fichiers .html sont assez gros pour être convertis rapidement en chaîne. Une idée de le charger avec un chemin absolu?
laph

2

La compilation de débogage est différente de celle de la version , donc:

Considérez votre structure de fichier de projet comme ça [ ce cas si pour un assemblage de débogage ]:

src
  |
  debug
      |
      assets
           |
           index.html

Vous devez appeler index.html dans votre WebView comme:

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

Ainsi de suite, pour l'assemblage Release, cela devrait ressembler à:

src
  |
  release
        |
        assets
             |
             index.html

La structure ci-dessous fonctionne également, pour les deux compilations [ debug et release ]:

src
  |
  main
     |
     assets
          |
          index.html
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.