我正在尝试从webview中调用html页面中定义的javascript方法。函数未被调用,我在日志中看不到任何错误。
这是html文件。
</head>
<body>
<script type="text/javascript">
function callJS(){
$.ajax({url:"http://10.0.2.2:5010"});
}
</script>
</body>
</html>
这是android中的Activity中的Java代码
WebView webView = new WebView(this);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("file:///android_asset/temp.html");
webView.loadUrl("javascript:callJS()");
不确定如何调试此内容。当我在html的body标签中添加onload=callJS()
时,我看到正在进行远程调用。所以,看起来我的HTML很好,它正被加载到webview中。但是,webview无法直接调用javascript方法。
答案 0 :(得分:7)
您应该在加载页面时执行javascript函数
webView.setWebViewClient(new WebViewClient() {
public void onPageFinished(WebView view, String url) {
webView.loadUrl("javascript:callJS()");
}
});
当您放置onload=callJS()
表示在加载页面时将调用javascript函数。
对于调试,你可以将console.log(“你的文字在这里”)放在你的javascript函数中,你将在你的android工作室日志中得到它。 (通常使用标记I/chromium
)。否则,您可以在Android上使用Chrome进行远程调试。这里的文档https://developer.chrome.com/devtools/docs/remote-debugging。
答案 1 :(得分:1)
请立即尝试:
活动代码:
public class MainActivity extends AppCompatActivity {
private WebView mWebView = null;
private ProgressBar mLoading;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.mWebView = (WebView)findViewById(R.id.wvPortal);
mLoading = (ProgressBar) findViewById(R.id.pbLoading);
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setDomStorageEnabled(true);
webSettings.setSupportZoom(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setUseWideViewPort(true);
webSettings.setSupportMultipleWindows(true);
mWebView.getSettings().setDomStorageEnabled(true);
mWebView.setWebChromeClient(new WebChromeClient());
/* To keep page navigation within the WebView and hence within the app,
we need to create a subclass of WebViewClient,and override its shouldOverrideUrlLoading(WebView webView, String url) method.*/
WebViewClientImpl webViewClient = new WebViewClientImpl(this);
mWebView.setWebViewClient(webViewClient);
mWebView.loadUrl("file:///android_asset/www/index.html");
WebSettings mWebSettings = mWebView.getSettings();
mWebSettings.setJavaScriptEnabled(true);
Log.d("Test 0","Interface calls");
//calling javascript interface:
// 1st.parameter is the JavaScript interface object itself.
// 2nd.parameter is the name of the global JavaScript variable which the JavaScript interface object is bound to.
mWebView.addJavascriptInterface(new AppJavaScriptProxy(this,mWebView), "androidAppProxy");
}
}
AppJavaScriptProxy类 for creationg interface:
public class AppJavaScriptProxy {
private Activity activity = null;
private WebView webView = null;
public AppJavaScriptProxy(Activity activity,WebView webview) {
this.activity = activity;
this.webView = webview;
Log.d("Test 1","in Interface");
}
@JavascriptInterface
public void showMessage(final String message) {
Log.d("from javascript", "" + message);
final Activity theActivity = this.activity;
final WebView theWebView = this.webView;
this.activity.runOnUiThread(new Runnable() {
@Override
public void run() {
if (!theWebView.getUrl().startsWith("file:///android_asset/www/index.html")) {
return;
}
Toast toast = Toast.makeText(
theActivity.getApplicationContext(),
message,
Toast.LENGTH_SHORT);
toast.show();
}
});
}
}
Index.html 在html页面中调用此脚本。
<input type="button" value="call Methode" onClick="showMessage("Message from JavaScript")" />
<script>
if(typeof androidAppProxy !== "undefined"){
androidAppProxy.showMessage("Message from JavaScript");
} else {
alert("Running outside Android app");
}
</script>
在任何按钮上单击webview索引页面调用此脚本。 参考。 Building webapps in webview
如果以上代码段可以帮助您,请投票给我答案。谢谢!