Memuat file .html yang ada dengan Android WebView

88

Saya memang mencoba sampel, demo dari kode Google dan sumber daya lain dengan WebView, tetapi ketika saya mencoba melakukannya dalam kode saya sendiri, itu tidak berhasil untuk saya.

Saya ingin memuat myfile.htmlyang saya masukkan ke folder aset, dan menggunakan:

private WebView myWebView;

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

Pada emulator menunjukkan kesalahan

Halaman web di file:///android_assets/myfile.htmltidak dapat dimuat karena: File yang diminta tidak ditemukan. /android_assets/myfile.html

Ketika saya meletakkan file itu ke res/raw/folder dan menggunakan:

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

maka hanya emulator android 2.2 API level 8 yang dapat memuat file mungkin, versi lama lainnya menunjukkan kesalahan yang sama. Apakah saya melewatkan sesuatu?

Apakah ada cara untuk memuat file .html yang ada dalam paket aplikasi yang berfungsi pada semua versi API?

laph
sumber

Jawaban:

162

ok, itu adalah kesalahanku yang sangat bodoh. Saya memposting jawabannya di sini kalau-kalau ada orang yang memiliki masalah yang sama.

Jalur yang benar untuk file yang disimpan dalam folder aset adalah file:///android_asset/*(tanpa "s" untuk folder aset yang saya selalu berpikir itu harus memiliki "s").

Dan, mWebView.loadUrl("file:///android_asset/myfile.html");berfungsi di semua level API.

Saya masih belum mWebView.loadUrl("file:///android_res/raw/myfile.html");mengerti mengapa hanya berfungsi pada API level 8. Tapi itu tidak masalah sekarang.

laph
sumber
50
FWIW Saya tidak berpikir itu adalah kesalahan bodoh. Saya membuat kesalahan yang sama sekarang, dua kali. Itu tidak intuitif! Pertama buat folder bernama "assets" lalu lihat dengan "android_asset" (tidak ada "s") ?? Ini platform yang bodoh, IMO: P
richtaur
3
buruk rawtidak bekerja. Saya akan menggunakan untuk raw-de, raw-frdan seterusnya. Sekarang saya harus melakukannya sendiri.
Martin
saya mencoba cara yang sama dipandu oleh laph tetapi ketika saya meletakkan file xml saya di folder yang Anda sebutkan myWebView.loadUrl ("file: ///android_res/raw/myfile.xml"); Ini memberi saya kesalahan yang Pastikan internet atau jalur benar dan ketika saya menulis myWebView.loadUrl ("file: //android_res/raw/myfile.xml"); itu tidak memberikan kesalahan apapun tetapi juga tidak menunjukkan apa-apa. Tolong bantu saya dalam hal ini.
Aditya1510
2
Hai Aditya, saya yakin kesalahan itu karena file Anda .xml. loadUrl misalkan memuat file .html. Harap perbaiki saya jika saya salah.
laph
Apakah ini mungkin? Aset folder berisi Javascript dan file lainnya, folder res / raw berisi file HTML
pengguna2422690
18

Jika struktur Anda harus seperti ini:

/assets/html/index.html

/assets/scripts/index.js

/assets/css/index.css

Kemudian lakukan saja ( Android WebView: menangani perubahan orientasi )

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

Pastikan Anda menambahkan

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

Kemudian gunakan saja 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">
EpicPandaForce
sumber
17

tempel file .html Anda di folder aset folder proyek Anda. dan buat file xml di folder layout dengan kode 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"
    />

tambahkan kode fol dalam aktivitas

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

Salin dan Tempel file .html Anda di folder aset Proyek Anda dan tambahkan kode di bawah ini ke Aktivitas Anda di 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
sumber
Itu adalah garis miring tiga kali lipat yang membuatku ///
Marc
2

Anda bisa membaca file html secara manual dan kemudian menggunakan loadDataatau loadDataWithBaseUrlmetode WebView untuk menampilkannya.

Lachezar
sumber
Hai Lucho, terima kasih atas jawaban Anda. Maksud Anda, saya harus mengubah file .html saya menjadi String, lalu memuatnya dengan metode loadData atau loadDataWithBaseUrl?
laph
2
File .html saya cukup besar untuk diubah menjadi string dengan cepat. Ada ide untuk memuatnya dengan jalur absolut?
laph
2

The kompilasi men-debug berbeda dari rilis satu, sehingga:

Pertimbangkan struktur file Project Anda seperti itu [ kasus ini jika untuk Debug assemble ]:

src
  |
  debug
      |
      assets
           |
           index.html

Anda harus memanggil index.html ke WebView Anda seperti:

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

Demikian seterusnya, untuk Release assemble harus seperti:

src
  |
  release
        |
        assets
             |
             index.html

Struktur di bawah ini juga berfungsi, untuk kompilasi [ debug dan rilis ]:

src
  |
  main
     |
     assets
          |
          index.html
PYK
sumber