Изменение HTML в WebView программно - PullRequest
5 голосов
/ 20 января 2012

Я загружаю страницу ресурса html в WebView, используя

webMain.loadUrl("file:///android_asset/record.html");

, которая работает нормально, но внутри html есть несколько мест, где я хотел бы использовать информацию из приложения.Например, HTML может содержать текст с надписью «[Custom]».Можно ли как-то заменить это слово информацией, переданной из приложения?

Ответы [ 5 ]

12 голосов
/ 09 декабря 2014

Это старый и уже принятый вопрос, однако я уверен, что проблему можно решить более изящным способом с помощью javascript.

Сохраните html-файл в папке ваших ресурсов и окружите текст, на который вы хотите заменить, элементами div с уникальными идентификаторами.

<html>
  <head> ... <head> 
  <body> 
    Static text
    <div id="replace1">replace me</div>
    <div id="replace2">replace me too</div> 
    More static text ... 
  </body>
</html>

Теперь создайте функцию javascript, которая заменит innerHtml элемента div на id :

    function replace(id, newContent)
    {
        document.getElementById(id).innerHTML = newContent;
    }

Эту функцию лучше всего разместить непосредственно в html-файле, обновите раздел <head>, чтобы он выглядел следующим образом:

<head>
  ...
    <script type="text/javascript">
        function replace(id, newContent)
        {
            document.getElementById(id).innerHTML = newContent;
        }
    </script>
</head>

Теперь нам нужно вызвать функцию javascript из API WebView Android:

WebView helpView = (WebView)findViewById(R.id.helpView);
helpView.getSettings().setJavaScriptEnabled(true);
helpView.setWebViewClient(new WebViewClient() {
  @Override
  public void onPageFinished(WebView view, String url) {
    super.onPageFinished(view, url);
    view.loadUrl("javascript:replace('replace1', 'new content 1')");
    view.loadUrl("javascript:replace('replace2', 'new content 2')");
  }
});
helpView.loadUrl("file:///android_asset/help.html");

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

4 голосов
/ 20 января 2012

На самом деле я не понимаю, почему размер файла record.html повлияет на поддержку кода.Считайте html-строку (используя класс чтения Java или что-либо еще) из html-файла в активе, используйте функцию replaceAll с Regex, чтобы заменить все [Custom] в html-файле.То, как долго будет работать HTML, не должно сильно влиять на то, как вы поддерживаете код.Скорее, это должно быть проблема с производительностью, или строка действительно очень длинная, которая превышает ограничение java String.

некоторый код, который я использовал раньше:

InputStream is = getApplicationContext().getAssets().open("details/product_jsmodify.html");
Reader r = new InputStreamReader(is);
String details = Utils.readertoString(r);
details = details.replace("%product_name%",productName );

Utils - это мой класс, выполняющийпреобразование в строку.Я не использую Regex здесь, так как я заменяю слово только один раз.Затем я загружаю строку, как это делает Cata.Полагаю, он довольно чистый.

3 голосов
/ 14 марта 2017

Это работает для меня.

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Payment Demo</title>
</head>
<body>
    <div>
        <input type="text" id="uname " name="uname " value="">
        <input type="text" id="pass" name="pass" value="">
    </div>
</body>
</html>

Это код Java.

WebView wb = (WebView) findViewById(R.id.webView1); 
wb.loadUrl("file:///android_asset/web1.html");
wb.getSettings().setJavaScriptEnabled(true);

wb.setWebViewClient(new WebViewClient() {

    @Override
    public void onPageFinished(WebView web, String url) {
        // TODO Auto-generated method stub
        String uname = "email@mail.com";
        String pass = "******";

        view.loadUrl("javascript:(function(){document.getElementById('uname').value = '"+uname+"';})()");
        view.loadUrl("javascript:(function(){document.getElementById('pass').value = '"+pass+"';})()");

    }
});
3 голосов
/ 20 января 2012

Да, вы можете сделать это, загрузив страницу в строку, а затем загрузив эту строку в ваш WebView.

Например:

String summary = "<html><body>You scored <b>192</b> points.</body></html>";
webview.loadData(summary, "text/html", null);

Взято из здесь

1 голос
/ 15 января 2016

Этот работал для меня, с HTML вместе с текстом и изображениями.

  InputStream is = getAssets().open(html_name);
            int size = is.available();

            byte[] buffer = new byte[size];
            is.read(buffer);
            is.close();

            String str = new String(buffer);
            str = str.replace("InitialTextToBeReplaced", "TextAfterReplacement");

       //Now instead of webview.loadURL(""), I needed to do something like -
            webView.loadDataWithBaseURL("file:///android_asset/", str, "text/html", "UTF-8",null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...