Завантаження існуючого .html-файлу за допомогою Android WebView


88

Я пробував зразки, демонстраційні програми з кодів Google та інших ресурсів WebView, але коли я намагаюся зробити це у своєму власному коді, це не працює для мене.

Я хочу завантажити те, myfile.htmlщо я помістив у папку ресурсів, і використовуючи:

private WebView myWebView;

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

На емуляторі відображається помилка

file:///android_assets/myfile.htmlНе вдалося завантажити веб-сторінку за адресою : Запитаний файл не знайдено. /android_assets/myfile.html

Коли я поміщаю цей файл у res/raw/папку та використовую:

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

тоді лише емулятор android 2.2 API рівня 8 може завантажити файл, ймовірно, інші попередні версії показують ту ж помилку. Мені чогось не вистачає?

Чи є спосіб завантаження існуючого файлу .html у пакет програм, який працює на всіх версіях API?

Відповіді:


162

добре, це була моя дуже дурна помилка. Я розміщу тут відповідь на той випадок, якщо хтось має таку ж проблему.

Правильний шлях до файлів, що зберігаються в папці "ресурси" file:///android_asset/*(без "s" для папки "активи", про яку я завжди думав, що вона повинна мати "s").

І mWebView.loadUrl("file:///android_asset/myfile.html");працює на всіх рівнях API.

Я досі не зрозумів, чому це mWebView.loadUrl("file:///android_res/raw/myfile.html");працює лише на рівні API 8. Але це зараз не має значення.


50
FWIW Я не думаю, що це була дурна помилка. Я зробив ту саму помилку зараз, двічі. Це не інтуїтивно! Спочатку створіть папку з назвою "активи", потім посилайтеся на неї за допомогою "android_asset" (немає "s") ?? Це дурна платформа, IMO: P
Річтавр

3
на погане rawне вийшло. Я б використовувати для raw-de, raw-frі так далі. Тепер я повинен це зробити сам.
Мартін

я спробував таким же чином, керуючись laph, але коли я помістив свій файл xml у папку, згадану вами, myWebView.loadUrl ("файл: ///android_res/raw/myfile.xml"); Це призводить до помилки в тому, що Переконайтеся, що Інтернет чи шлях правильний, і коли я пишу myWebView.loadUrl ("файл: //android_res/raw/myfile.xml"); це не дає жодної помилки, але також нічого не показує. Будь ласка, допоможіть мені в цьому.
Aditya1510,

2
Привіт Aditya, я вважаю, що помилка в тому, що ваш файл .xml. loadUrl припустимо завантажити файл .html. Будь ласка, виправте мене, якщо я помиляюся.
laph

Чи можливо це?
Ресурси

18

Якщо ваша структура повинна бути такою:

/assets/html/index.html

/assets/scripts/index.js

/assets/css/index.css

Тоді просто зробіть ( Android WebView: обробка змін орієнтації )

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

Обов’язково додайте

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

Тоді просто використовуйте 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">

17

вставте файл .html у папку активів папки проекту. і створіть файл xml у папці макета з наступним кодом: 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"
    />

додати фол-код в діяльність

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.

6

Скопіюйте та вставте свій файл .html у папку активів вашого проекту та додайте нижче код у свою діяльність на 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);

це мене
Марк

2

Ви можете прочитати файл html вручну, а потім використати loadDataабо loadDataWithBaseUrlметоди WebView, щоб показати його.


Привіт Лучо, дякую за вашу відповідь. Це означає, що я повинен перетворити свій файл .html у рядок, а потім завантажити його методом loadData або loadDataWithBaseUrl?
laph

2
мої файли .html досить великі, щоб їх швидко перетворити на рядок. Будь-яка ідея завантажити його абсолютним шляхом?
laph

2

Налагодження збірник відрізняється від випуску однієї, так:

Розгляньте структуру файлу вашого проекту таким чином [у цьому випадку, якщо для збірки налагодження ]:

src
  |
  debug
      |
      assets
           |
           index.html

Вам слід викликати index.html у свій WebView, наприклад:

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

Отже, для Release assemble це повинно виглядати так:

src
  |
  release
        |
        assets
             |
             index.html

Наведена нижче структура також працює для обох компіляцій [ налагодження та випуск ]:

src
  |
  main
     |
     assets
          |
          index.html
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.