web-dev-qa-db-fra.com

Affichage des fichiers d'actif Android dans une WebView?

J'ai vu diverses discussions sur le problème de la diffusion de pages WebView à partir de ressources, dont aucune ne semblait définitive.

Je veux pouvoir utiliser une vue Web pour afficher les fichiers html (et css inclus) stockés dans les actifs du projet.

J'ai trouvé que wv.loadUrl ("file: ///Android_asset/html_no_copy/demo_welcome.html") affiche ce fichier correctement, mais les liens dans demo_welcome.html, soit locaux (pas d'url préfixant le nom du fichier) ou absolus - les mêmes forme comme alimenté à loadUrl - ne fonctionne pas. Ils obtiennent une erreur "Page Web non disponible" affichée sur la vue.

WebView wv = (WebView)this.findViewById(R.id.splashWebView);
wv.loadUrl("file:///Android_asset/html_no_copy/test.html"); // Works

ou

wv.loadUrl("file:///Android_asset/html_no_copy/demo_welcome.html"); // Works

Mais aucun des liens suivants dans demo_welcome.html ne fonctionne:

<a href="test.html">CLICK HERE</a><p>
<a href="file:///Android_asset/html_no_copy/test.html">OR HERE</a>

Je sais que je peux contourner ce problème en écrivant un fournisseur de contenu, mais cela semble extrême.

Je veux que cela fonctionne à partir du SDK 1.6 (4).

Est-ce que quelqu'un sait si cela peut être fait avec seulement du HTML, ou faut-il kluge du code pour charger les données?

23
Mesocyclone

Eh bien, j'ai trouvé quelque chose qui semble fonctionner (sur 1.6 et 2.2), malgré un avertissement selon lequel il récurrencerait.

J'ai également découvert qu'un lien de feuille de style CSS à l'intérieur de la première et de la deuxième page fonctionne sans l'interception suivante. Bizarre et ça me rend un peu nerveux. Pensées?

Voici le code:

WebView wv = (WebView)this.findViewById(R.id.splashWebView);
wv.setWebViewClient(new WebViewClient() {  
  @Override  
  public boolean shouldOverrideUrlLoading(WebView view, String url)  
  {  
    view.loadUrl(url);
    return true;
  }  
}); 
wv.loadUrl("file:///Android_asset/html_no_copy/demo_welcome.html");

Voici le contenu du fichier:

demo_welcome.html:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Demo Html</title>
    <link rel="stylesheet" type="text/css" href="demo.css" />
  </head>
  <body>
    <H1>Testing One Two Three</H1>
    <a href="test.html">CLICK HERE</a><p>
    <a href="file:///Android_asset/html_no_copy/test.html">OR HERE</a>
  </body>
</html>

test.html:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <link rel="stylesheet" type="text/css" href="test.css" />
    <title>Insert title here</title>
  </head>
  <body>
    <H1>TEST.HTML</H1>
  </body>
</html>
28
Mesocyclone

au lieu de loadUrl, essayez d'utiliser la méthode loadDataWithBaseURL:

wv.loadDataWithBaseURL("fake://not/needed", html, mimeType, encoding, "");
8
Stephane JAIS