Android Webview HTML Загрузка Javascript Проблема - PullRequest
7 голосов
/ 17 марта 2011

Я боролся с этой проблемой уже более 48 часов, и мне не удалось найти ответ нигде в сети. Вот настройки:

Мое приложение Android загружает контент при первом запуске (объем превышает 20 МБ), и файлы распаковываются на SD-карту пользователя в папке / mnt / sdcard / {my package} /. Содержимое включает в себя файлы HTML, файлы CSS, файлы JS и изображения. Вот полная структура того, что записано на SD-карту (где / = / mnt / sdcard / {мой пакет} / папка /):

/ содержание /

a.html
b.html
images/
  image1.jpg

/ CSS /

c.css
d.css

/ JS /

e.js
f.js

Вот мой код, который загружает HTML-файл с SD-карты:

    webView = (WebView) findViewById(R.id.pageBrowser);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.addJavascriptInterface(new LinkHandlerInterface(), "Android");
    webView.setWebViewClient(new PageWebViewClient());

    // contentLocation + url is equal to the full path to the html file
    webView.loadUrl("file://" + contentLocation + url);

Этот код успешно загружает HTML-страницу. Проблем пока нет. Каждая страница имеет следующий заголовок:

    <link rel="stylesheet" type="text/css" href="../css/screen.css" media="all" />
    <link rel="stylesheet" type="text/css" href="../css/inPractice.css" media="all" />
    <link rel="stylesheet" type="text/css" href="../css/inPracticeScheme.css" media="all" />
    <link rel="stylesheet" type="text/css" href="../css/mobile/iPad.css" media="all" />
    <script type="text/javascript" src="../js/jquery-1.3.2.min.js"></script>
    <script type="text/javascript" src="../js/inPractice-utilities.js"></script>
    <script type="text/javascript" src="../js/inPractice.js"></script>
    <script type="text/javascript" src="../js/mobile/inpractice.ipad.js"></script>

Вот в чем проблема. Мой WebView прекрасно отображает HTML. Он даже отлично загружает и применяет CSS. Однако он отказывается загружать и выполнять Javascript. Если вы помните сверху, папка js фактически на один уровень выше html-файла, поэтому она указывает на правильное место.

Вот список того, что я знаю:

  • Используемый мной CSS применяется нормально, поэтому я знаю, что проблема не в расположении файла.

  • Я использовал этот код раньше, но загружал файлы из папки ресурсов моего приложения (file: /// android_assets / ...), и он работал отлично. Поскольку содержимое настолько велико, я не могу связать его с моим приложением, поэтому перехожу на SD-карту.

  • Если я изменю файлы HTML таким образом, чтобы все методы Javascript были перечислены в теге сценария, он работает нормально. У меня нет контроля над HTML, поэтому я не могу применить это изменение навсегда. Это говорит мне, что у WebView нет проблем с выполнением Javascript.

  • Изображения загружаются нормально.

У меня сейчас нет идей. Кто-нибудь знает, почему мой WebView не может загрузить мои файлы Javascript? Кто-нибудь видел это раньше?

РЕДАКТИРОВАТЬ: Вот файлы JS, которые я пытаюсь использовать, можно посмотреть здесь:

http://www.automatastudios.com/clients/cco/inpractice/css/inPractice.css http://www.automatastudios.com/clients/cco/inpractice/css/inPracticeScheme.css http://www.automatastudios.com/clients/cco/inpractice/css/screen.css http://www.automatastudios.com/clients/cco/inpractice/css/mobile/iPad.css

  • ПРИМЕЧАНИЕ. Эти CSS-файлы не были созданы мной.

Ответы [ 2 ]

3 голосов
/ 10 мая 2011

Никогда не мог найти решение этой проблемы.

В итоге я просто отредактировал файлы HTML, так что исходные файлы Javascript изменились на встроенный Javascript.Это сработало (как я и ожидал).

0 голосов
/ 03 февраля 2014

Предпочтительный способ загрузки html, который ссылается на js, css, заключается в использовании

webView.loadDataWithBaseURL()

Нам нужно передать корневой каталог места, где html, js, css находятся в файлеСистема как baseURL.Здесь важно отметить, что нам нужно использовать только URL-адрес «файловой» схемы.

В вашем случае код должен быть

    String html = readFileAsString(
       new FileInputStream("file://" + contentLocation + url) );
webView.loadDataWithBaseURL("file://" + contentLocation,html,"text/html","utf-8",null);


public static StringBuffer streamToString(InputStream stream ){

        StringBuffer fileContent = new StringBuffer("");
        try {

            int size = stream.available();
            byte[] buffer = new byte[size];
            int length;
            while ((length = stream.read(buffer)) != -1) {
                fileContent.append(new String(buffer));
            }
            stream.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            try {
                stream.close();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }

        return fileContent;
    }

Надеюсь, ответ поможет будущим посетителям

PS: приведенный выше фрагмент кода не скомпилирован

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...