Caricamento del file .html esistente con Android WebView


86

Ho provato campioni, demo dai codici Google e altre risorse con WebView, ma quando provo a farlo nel mio codice, non funziona per me.

Voglio caricare quello myfile.htmlche ho inserito nella cartella delle risorse e utilizzando:

private WebView myWebView;

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

Sull'emulatore mostra un errore

file:///android_assets/myfile.htmlImpossibile caricare la pagina web all'indirizzo : Il file richiesto non è stato trovato. /android_assets/myfile.html

Quando metto quel file nella res/raw/cartella e utilizzo:

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

quindi solo l'emulatore Android 2.2 API livello 8 può caricare il file probabilmente, altre versioni precedenti mostrano lo stesso errore. Mi sto perdendo qualcosa?

Esiste un modo per caricare un file .html esistente nel pacchetto dell'applicazione che funziona su tutte le versioni API?

Risposte:


161

ok, questo è stato il mio errore molto stupido. Inserisco qui la risposta nel caso qualcuno abbia lo stesso problema.

Il percorso corretto per i file archiviati nella cartella degli asset è file:///android_asset/*(senza "s" per la cartella degli asset che ho sempre pensato che dovesse avere una "s").

E mWebView.loadUrl("file:///android_asset/myfile.html");funziona sotto tutti i livelli API.

Non riesco ancora a capire perché mWebView.loadUrl("file:///android_res/raw/myfile.html");funziona solo a livello API 8. Ma ora non importa.


50
FWIW Non penso sia stato uno stupido errore. Ho fatto lo stesso errore adesso, due volte. Non è intuitivo! Per prima cosa crea una cartella chiamata "assets", quindi fai riferimento ad essa con "android_asset" (no "s") ?? È la piattaforma che è stupida, IMO: P
richtaur

3
a male rawnon ha funzionato. Avrei usato per raw-de, raw-fre così via. Ora devo farlo da solo.
Martin,

ho provato allo stesso modo guidato da laph ma quando ho messo il mio file xml nella cartella da te indicata myWebView.loadUrl ("file: ///android_res/raw/myfile.xml"); Mi dà un errore che assicuri che Internet o il percorso siano corretti e quando scrivo myWebView.loadUrl ("file: //android_res/raw/myfile.xml"); non dà alcun errore ma anche non mostra nulla. Per favore aiutami in questo.
Aditya1510

2
Ciao Aditya, credo che l'errore sia dovuto al fatto che il tuo file è .xml. loadUrl supponiamo di caricare un file .html. Per favore correggimi se sbaglio.
laph

È possibile? Le risorse della cartella contengono Javascript e altri file, la cartella res / raw contiene file HTML
user2422690

17

incolla il tuo file .html nella cartella delle risorse della cartella del tuo progetto. e crea un file xml nella cartella layout con il codice 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"
    />

aggiungi il codice fol in attività

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

Se la tua struttura dovrebbe essere così:

/assets/html/index.html

/assets/scripts/index.js

/assets/css/index.css

Quindi basta fare ( Android WebView: gestire le modifiche dell'orientamento )

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

Assicurati di aggiungere

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

Quindi usa solo gli 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

Copia e incolla il tuo file .html nella cartella delle risorse del tuo progetto e aggiungi il codice sottostante nella tua attività su 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);

è stato il triplo taglio che mi ha portato ///
Marc

2

È possibile leggere il file html manualmente e quindi utilizzare i metodi loadDatao loadDataWithBaseUrldi WebView per mostrarlo.


Ciao Lucho, grazie per la tua risposta. Vuoi dire che devo convertire il mio file .html in String, quindi caricarlo con il metodo loadData o loadDataWithBaseUrl?
laph

2
i miei file .html sono abbastanza grandi da convertire rapidamente in stringa. Qualche idea per caricarlo con percorso assoluto?
laph

2

La compilazione del debug è diversa da quella del rilascio , quindi:

Considera la struttura del tuo file di progetto in questo modo [ questo caso se per un assemblaggio di debug ]:

src
  |
  debug
      |
      assets
           |
           index.html

Dovresti chiamare index.html nella tua WebView come:

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

Quindi, per l'assemblaggio di rilascio, dovrebbe essere come:

src
  |
  release
        |
        assets
             |
             index.html

Anche la struttura qui sotto funziona, per entrambe le compilation [ debug e release ]:

src
  |
  main
     |
     assets
          |
          index.html
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.