2011-03-16 8 views
23

He visto varias discusiones sobre el problema de dar servicio a páginas de WebView desde activos, ninguna de las cuales parecía definitiva.¿Mostrar archivos de activos de Android en un WebView?

Quiero poder usar una vista web para visualizar archivos html (y css incluidos) almacenados en los recursos del proyecto.

He encontrado que wv.loadUrl ("archivo: ///android_asset/html_no_copy/demo_welcome.html") muestra ese archivo bien, pero los enlaces en demo_welcome.html, ya sea local (sin url prefijando el nombre del archivo) o absolute - la misma forma que fed a loadUrl - no funciona. Obtienen un error de "página web no disponible" que se muestra en la vista.

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

o

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

Pero ninguno de los siguientes enlaces en demo_welcome.html trabajo:

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

Sé que puedo evitar esto mediante la escritura de un proveedor de contenidos, pero que parece extremo.

Quiero que esto funcione desde SDK 1.6 (4) en adelante.

¿Alguien sabe si esto se puede hacer solo con HTML, o uno necesita codificar algún código para cargar los datos?

Respuesta

28

Bueno, encontré algo que parece funcionar (en 1.6 y 2.2), a pesar de una advertencia de que volvería a aparecer.

También descubrí que un enlace de hoja de estilo css dentro de la primera y la segunda página funciona sin la siguiente intercepción. Extraño y me pone un poco nervioso. ¿Pensamientos?

Aquí está el código:

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

Aquí es el contenido del archivo:

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

en lugar de LoadURL, intente utilizar el método loadDataWithBaseURL:

wv.loadDataWithBaseURL("fake://not/needed", html, mimeType, encoding, ""); 
+0

Hola Stephane, ¿cuál es el html objeto por el que estás pasando? ¿El primer argumento no se usa? –

+0

+1 Esto funcionó para mí. El primer argumento es solo una URL base falsa. Puede ser cualquier cosa. Y 'html' es la cadena que contiene el código HTML. – Kayla

+2

Sucio y no responde la pregunta. –

Cuestiones relacionadas