我无法从Android内部调用基本的JavaScript函数。当我从this tutorial克隆存储库,然后将其剥离时,我能够使代码正常运行。但是,当尝试创建自己的新项目时,我没有成功。
我已经参考了以下帖子,并且似乎在做同样的事情,但无济于事。两种方法之间没有明显的不同,所以我觉得这些文件之外可能还缺少依赖项?
Android Calling JavaScript functions in WebView
Run javascript code 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>
然后从我的活动课中,我有以下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()
?
答案 0 :(得分:3)
根据CW answer,
您需要等到页面加载完毕
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();
}
});
答案 1 :(得分:0)
你能试试吗
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);
答案 2 :(得分:0)
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
MainActivity.java
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import com.bluapp.androidview.R;
public class WebViewActivity3 extends AppCompatActivity {
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_view3);
webView = (WebView) findViewById(R.id.webView);
webView.setWebViewClient(new WebViewClient());
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("file:///android_asset/webview1.html");
webView.setWebViewClient(new WebViewClient(){
public void onPageFinished(WebView view, String weburl){
webView.loadUrl("javascript:testEcho('Javascript function in webview')");
}
});
}
}
assets / webview1.html
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>WebView1</title>
<meta forua="true" http-equiv="Cache-Control" content="max-age=0"/>
</head>
<body style="background-color:#212121">
<script type="text/javascript">
function testEcho(p1){
document.write(p1);
}
</script>
</body>
</html>