Cargando archivo .html existente con Android WebView

86

Probé muestras, demostraciones de códigos de Google y otros recursos con WebView, pero cuando trato de hacerlo en mi propio código, no me funciona.

Quiero cargar lo myfile.htmlque puse en la carpeta de activos y usar:

private WebView myWebView;

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

En el emulador muestra error

La página web en file:///android_assets/myfile.htmlno se pudo cargar como: No se encontró el archivo solicitado. /android_assets/myfile.html

Cuando coloco ese archivo en la res/raw/carpeta y uso:

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

entonces solo el emulador Android 2.2 API nivel 8 puede cargar el archivo probablemente, otras versiones anteriores muestran el mismo error. ¿Me estoy perdiendo de algo?

¿Hay alguna forma de cargar un archivo .html existente en el paquete de la aplicación que funcione en todas las versiones de API?

laph
fuente

Respuestas:

161

ok, ese fue mi muy estúpido error. Publico la respuesta aquí en caso de que alguien tenga el mismo problema.

La ruta correcta para los archivos almacenados en la carpeta de activos es file:///android_asset/*(sin "s" para la carpeta de activos, que siempre pensé que debía tener una "s").

Y mWebView.loadUrl("file:///android_asset/myfile.html");funciona en todos los niveles de API.

Todavía no entiendo por qué mWebView.loadUrl("file:///android_res/raw/myfile.html");funciona solo en el nivel de API 8. Pero ahora no importa.

laph
fuente
50
FWIW: No creo que haya sido un error estúpido. Cometí el mismo error ahora, dos veces. ¡No es intuitivo! Primero haga una carpeta llamada "assets" y luego refiérase a ella por "android_asset" (no "s") ?? Es la plataforma la que es estúpida, IMO: P
richtaur
3
a mal rawno funcionó. Tendría uso para raw-de, raw-fry así sucesivamente. Ahora tengo que hacerlo yo mismo.
Martin
Intenté de la misma manera guiado por laph pero cuando puse mi archivo xml en la carpeta mencionada por usted myWebView.loadUrl ("file: ///android_res/raw/myfile.xml"); Me da un error que asegure que Internet o la ruta sea correcta y cuando escribo myWebView.loadUrl ("file: //android_res/raw/myfile.xml"); no da ningún error pero tampoco muestra nada. Por favor ayúdame en esto.
Aditya1510
2
Hola Aditya, creo que el error se debe a que su archivo es .xml. loadUrl supone que debe cargar un archivo .html. Por favor corrígeme si estoy equivocado.
laph
es posible? Los activos de carpeta contienen Javascript y otros archivos, la carpeta res / raw contiene archivos HTML
user2422690
17

pegue su archivo .html en la carpeta de activos de la carpeta de su proyecto. y cree un archivo xml en la carpeta de diseño con el código 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"
    />

agregar código fol en actividad

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
fuente
16

Si su estructura debería ser así:

/assets/html/index.html

/assets/scripts/index.js

/assets/css/index.css

Entonces solo hazlo ( Android WebView: manejo de cambios de orientación )

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

Asegúrate de agregar

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

Entonces solo usa urls

<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
fuente
6

Copie y pegue su archivo .html en la carpeta de activos de su proyecto y agregue el código siguiente en su actividad en 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
fuente
fue el triple slash lo que me atrapó ///
Marc
2

Se podía leer el archivo HTML de forma manual y luego usar loadDatao loadDataWithBaseUrlmétodos de WebView mostrarlo.

Lachezar
fuente
Hola Lucho, gracias por tu respuesta. ¿Quiere decir que tengo que convertir mi archivo .html en String, luego cargarlo con el método loadData o loadDataWithBaseUrl?
laph
2
mis archivos .html son bastante grandes para convertirlos en cadenas rápidamente. ¿Alguna idea de cargarlo con ruta absoluta?
laph
2

La compilación de depuración es diferente a la de lanzamiento , por lo que:

Considere la estructura de su archivo de proyecto así [ este caso es para un ensamblaje de depuración ]:

src
  |
  debug
      |
      assets
           |
           index.html

Debe llamar a index.html en su WebView como:

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

Así sucesivamente, para el montaje Release, debería ser como:

src
  |
  release
        |
        assets
             |
             index.html

La estructura de abajo también funciona, para ambas compilaciones [ depuración y publicación ]:

src
  |
  main
     |
     assets
          |
          index.html
PYK
fuente