以编程方式更改WebView中的HTML

时间:2012-01-20 07:34:48

标签: android android-webview

我正在使用

将html资源页面加载到WebView中
webMain.loadUrl("file:///android_asset/record.html");

工作正常,但在html中有很多我想使用应用程序信息的地方。例如,HTML可能包含“[Custom]”的文本。有没有办法可以用从应用程序传递的信息替换该单词?

5 个答案:

答案 0 :(得分:12)

这是一个古老且已被接受的问题,但我相信使用javascript可以更优雅的方式解决问题。

将html文件保留在您的资源文件夹中,并使用具有唯一ID的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函数,它将用 id 替换div的innerHtml:

    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>

现在我们需要从WebView Android api调用javascript函数:

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

使用它可以避免将潜在的大数据读入内存并不必要地对其进行昂贵的操作。

答案 1 :(得分:4)

实际上我不明白为什么record.html的文件大小会影响代码的维护。从资产中的html文件中读取html字符串(使用Java reader类或其他任何内容),使用带有Regex的replaceAll函数替换html文件中的所有[Custom]。 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是我的班级转换为字符串。我没有在这里使用正则表达式,因为我只替换一次单词。然后我像Cata一样加载字符串。我想这很干净。

答案 2 :(得分:3)

是的,您可以通过在String中加载页面然后在WebView中加载该字符串来实现。

例如:

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

取自here

答案 3 :(得分:3)

这对我有用。

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

    }
});

答案 4 :(得分:1)

这个对我有用,带有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);