从 Android 呼叫 JavaScript
Calling JavaScript from Android
我在从 Android 中调用基本 Java 脚本函数时遇到问题。当我从 this tutorial 克隆存储库,然后将其剥离时,我能够使代码正常运行。但是,当我尝试创建自己的新项目时,我一直没有成功。
我参考了以下帖子,似乎也在做同样的事情,但无济于事。这些方法之间没有明显的区别,所以我觉得这些文件之外可能有我遗漏的依赖项?
Android Calling JavaScript functions in WebView
我想知道我是否遗漏了一些微妙的地方。
基本上我只是试图通过调用在其自己的文件中定义的 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 class 我有以下 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)
如何修复此代码以便能够调用单独文件中的简单 Java脚本函数 hello()
?
你能试试这个吗
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);
根据 CW answer,
You need to wait until your page is loaded
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();
}
});
我在从 Android 中调用基本 Java 脚本函数时遇到问题。当我从 this tutorial 克隆存储库,然后将其剥离时,我能够使代码正常运行。但是,当我尝试创建自己的新项目时,我一直没有成功。
我参考了以下帖子,似乎也在做同样的事情,但无济于事。这些方法之间没有明显的区别,所以我觉得这些文件之外可能有我遗漏的依赖项?
Android Calling JavaScript functions in WebView
我想知道我是否遗漏了一些微妙的地方。
基本上我只是试图通过调用在其自己的文件中定义的 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 class 我有以下 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)
如何修复此代码以便能够调用单独文件中的简单 Java脚本函数 hello()
?
你能试试这个吗
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);
根据 CW answer,
You need to wait until your page is loaded
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();
}
});