Загрузка существующего файла .html с помощью Android WebView

86

Я пробовал образцы, демонстрации из кодов 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?

лаф
источник

Ответы:

161

хорошо, это была моя очень глупая ошибка. Я отправляю ответ здесь на случай, если у кого-то такая же проблема.

Правильный путь для файлов, хранящихся в папке 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 Я не думаю, что это была глупая ошибка. Я сделал одну и ту же ошибку дважды. Это не интуитивно! Сначала создайте папку с именем «assets», а затем назовите ее «android_asset» (без «s») ?? Это глупая платформа, ИМО: P
richtaur
3
плохо rawне получилось. Я бы использовать для raw-de, raw-frи так далее. Теперь я должен это сделать сам.
Мартин
Я пробовал так же, руководствуясь Laph, но когда я помещал свой XML-файл в указанную вами папку myWebView.loadUrl ("file: ///android_res/raw/myfile.xml"); Это дает мне ошибку: Убедитесь, что Интернет или путь правильный, и когда я пишу myWebView.loadUrl ("file: //android_res/raw/myfile.xml"); он не дает никаких ошибок, но он также ничего не показывает. Пожалуйста, помогите мне в этом.
Aditya1510,
2
Привет, Адитья, я считаю, что ошибка связана с тем, что у вас файл .xml. loadUrl предполагает загрузку файла .html. Пожалуйста, поправьте меня, если я ошибаюсь.
лапф
Это возможно? Папка assets содержит Javascript и другие файлы, папка res / raw содержит файлы HTML
user2422690,
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"
    />

добавить код Fol в действие

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

Если ваша структура должна быть такой:

/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">
EpicPandaForce
источник
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);
Арункумар
источник
это был
Marc
2

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

Лачезар
источник
Привет Лучо, спасибо за ответ. Вы имеете в виду, что мне нужно преобразовать свой файл .html в String, а затем загрузить его с помощью метода loadData или loadDataWithBaseUrl?
лапф
2
мои файлы .html довольно большие, чтобы их можно было быстро преобразовать в строку. Есть идеи загрузить его с абсолютным путем?
лапф
2

Отладки сборник отличается от выпуска одной, так:

Рассмотрим файловую структуру вашего проекта таким образом [ этот случай для сборки отладки ]:

src
  |
  debug
      |
      assets
           |
           index.html

Вы должны вызвать index.html в свой WebView, например:

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

Итак, для сборки Release это должно быть примерно так:

src
  |
  release
        |
        assets
             |
             index.html

Приведенная ниже структура также работает для обеих компиляций [ отладка и выпуск ]:

src
  |
  main
     |
     assets
          |
          index.html
PYK
источник