以编程方式更改WebView中的HTML

Daw*_*ell 7 android android-webview

我正在使用html资源页面加载到WebView中

webMain.loadUrl("file:///android_asset/record.html");
Run Code Online (Sandbox Code Playgroud)

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

Ada*_*mVe 14

这是一个古老且已被接受的问题,但我确信通过使用javascript可以更优雅地解决问题.

将html文件保存在assets文件夹中,并使用具有唯一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>
Run Code Online (Sandbox Code Playgroud)

现在创建一个javascript函数,它将用一个id替换div的innerHtml :

    function replace(id, newContent)
    {
        document.getElementById(id).innerHTML = newContent;
    }
Run Code Online (Sandbox Code Playgroud)

这个函数最好直接放在html文件中,更新<head>部分如下所示:

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

现在我们需要从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");
Run Code Online (Sandbox Code Playgroud)

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


Nin*_*nja 5

这对我有用。

<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>
Run Code Online (Sandbox Code Playgroud)

这是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 = "******";

        web.loadUrl("javascript:(function(){document.getElementById('uname').value = '"+uname+"';})()");
        web.loadUrl("javascript:(function(){document.getElementById('pass').value = '"+pass+"';})()");
            
    }
});
Run Code Online (Sandbox Code Playgroud)


reT*_*eTs 4

其实我不明白为什么record.html的文件大小会影响代码的维护。从 asset 中的 html 文件中读取 html 字符串(使用 Java reader 类或其他什么),使用带有 Regex 的 ReplaceAll 函数来替换 html 文件中的所有 [Custom]。html 的长度不应真正影响您维护代码的方式。它应该是一个性能问题,或者字符串真的很长,超出了java字符串限制。

我之前使用过的一些代码:

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 );
Run Code Online (Sandbox Code Playgroud)

Utils 是我的类,负责转换为字符串。我在这里没有使用正则表达式,因为我只替换单词一次。然后我像 Cata 一样加载字符串。我想它很干净。