从Android调用JavaScript

5
我在Android中调用基本的JavaScript函数遇到了麻烦。我从这个教程克隆了存储库,然后将其删减后,我能够使代码正确运行。然而,当我尝试创建自己的新项目时,我并没有成功。
我已经参考了以下帖子,看起来我正在做同样的事情,但都无济于事。这些方法之间没有明显的差异,所以我感觉可能有一些依赖文件我还没有添加? Android调用WebView中的JavaScript函数 在Webview中运行JavaScript代码 我想知道是否我遗漏了一些微小的地方。
基本上,我只是想通过调用定义在自己文件中的JavaScript函数来获得控制台的任何输出。该项目结构如下:
main
- assets
  - index.html
  - sketch.js

- java
  - com.mypackage
    - MainActivity.java

我有一个名为sketch.js的文件,其中包含以下函数

function hello() {
    console.log("hello world");
}

以下是包含如下代码的index.html文件

<!DOCTYPE html>
<html>
  <head>
    <script src="sketch.js" type="text/javascript"></script>

  </head>
  <body>
  <canvas></canvas>
  </body>
</html>

然后从我的activity类中有以下Java代码。
webView = (WebView) findViewById(R.id.webView);
webView.setWebChromeClient(new WebChromeClient());
webView.getSettings().setJavaScriptEnabled(true);

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

webView.evaluateJavascript("javascript:hello();", null);
webView.evaluateJavascript("console.log('Hello world 2');", null);

在Android Studio的控制台中,我看到了:
[INFO:CONSOLE(1)] "Uncaught ReferenceError: hello is not defined", source:  (1)
I/chromium: [INFO:CONSOLE(1)] "Hello world 2", source:  (1)

我该如何修复这段代码,以便能够调用另一个文件中的简单JavaScript函数 hello()
2个回答

10

根据CW的回答

您需要等待页面加载完成。

private void helloJs(){
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
        webView.evaluateJavascript("javascript:hello();", null);
    } else {
        webView.loadUrl("javascript:hello();");
    }
}

webView.setWebViewClient(new WebViewClient() {
    public void onPageFinished(WebView view, String url) {
        helloJs();
    }
});

2

你能试试这个吗?

webView = (WebView)findViewById(R.id.webView);
webView.setWebViewClient(new webViewClient()); \\ added this line
webView.getSettings().setJavaScriptEnabled(true); \\ moved this line before to setting Web Chrome Client
webView.setWebChromeClient(new WebChromeClient());

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

webView.evaluateJavascript("javascript:hello();", null);
webView.evaluateJavascript("console.log('Hello world 2');", null);

你的webViewClient类中有什么内容,为什么需要它?我假设这将是一个自定义内部类,我需要正确定义吗?我尝试创建了一个扩展WebViewClient的空白类,但这并没有改变情况。 - btin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接