我们如何在我们的android应用程序中执行javascript函数并获得返回值?
我们想在按钮按下事件上执行javascript,我们需要将参数传递给脚本并获取返回值,所以我们使用"WebChromeClient"来实现它,但我们得到的异常是"SyntaxError:未定义的解析错误:1 "
以下是我的代码
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
public class FirstTab extends Activity
{
private WebView webView;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.regis);
try{
webView = (WebView) findViewById(R.id.webView1);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebChromeClient(new MyWebChromeClient());
String customHtml = "<html><head><title>iSales</title><script type=\"text/javascript\"> function fieldsOnDelete(){ var x=123; return \"JIJO\"; } </script></head><body>hi</body></html>";
webView.loadData(customHtml, "text/html","UTF-8");
}catch(Exception e)
{
Log.v("JAC LOG",e.toString());
}
}
public void onResume()
{
super.onResume();
final Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try{
webView.loadUrl("javascript:alert(javascript:fieldsOnDelete())");
}
catch(Exception e)
{
Log.v("JAC LOG",e.toString());
}
}
});
}
final class MyWebChromeClient extends WebChromeClient {
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
Log.v("LogTag", message);
result.confirm();
return true;
}
}
}
Run Code Online (Sandbox Code Playgroud)
你可以 mWebView.loadUrl("javascript:checkName");
用来调用方法......
然后,您可以使用addJavascriptInterface()
将Java对象添加到Javascript环境中.让Java脚本在该Java对象上调用一个方法来提供其"返回值".
编辑1:或者您可以使用以下hack:
将此客户端添加到WebView:
final class MyWebChromeClient extends WebChromeClient {
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
Log.d("LogTag", message);
result.confirm();
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
现在在你的java脚本调用中执行:
webView.loadUrl("javascript:alert(functionThatReturnsSomething)");
Run Code Online (Sandbox Code Playgroud)
现在在onJsAlert调用中" message
"将包含返回的值.
EDIT2:
因此,如果我们在调用加载URL之后调用javascript方法,它就不起作用,因为页面加载需要时间.所以我创建了一个测试程序来测试......
以下是我的资产文件夹中的html文件(名为test.html)商店:
<html>
<head>
<script language="javascript">
function fieldsOnDelete(message) {
alert("i am called with " + message);
window.myjava.returnValue(message + " JIJO");
}
</script>
<title>iSales android</title>
</head>
<body></body>
</html>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
以下是我的java类,我将添加到java脚本作为接口,它将收到返回值:
public class MyJS {
public void returnValue(String string){
Log.d(this.getClass().getSimpleName(), string);
}
}
Run Code Online (Sandbox Code Playgroud)
以下是我的活动课程:
public class CheckWebView extends Activity {
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_check_web_view);
webView = (WebView) findViewById(R.id.webview);
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onConsoleMessage(String message, int lineNumber,
String sourceID) {
super.onConsoleMessage(message, lineNumber, sourceID);
Log.d(this.getClass().getCanonicalName(), "message " + message
+ " :::line number " + lineNumber + " :::source id "
+ sourceID);
}
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
// TODO Auto-generated method stub
onConsoleMessage(consoleMessage.message(),
consoleMessage.lineNumber(), consoleMessage.sourceId());
Log.d(this.getClass().getCanonicalName(), "message::::: "
+ consoleMessage.message());
return super.onConsoleMessage(consoleMessage);
}
});
webView.addJavascriptInterface(new MyJS(), "myjava");
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setPluginsEnabled(true);
webView.getSettings().setAllowFileAccess(true);
webView.loadUrl("file:///android_asset/test.html");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_check_web_view, menu);
return true;
}
/* (non-Javadoc)
* @see android.app.Activity#onOptionsItemSelected(android.view.MenuItem)
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
webView.loadUrl("javascript:fieldsOnDelete('name');");
return super.onOptionsItemSelected(item);
}
}
Run Code Online (Sandbox Code Playgroud)
这里的关键是调用从assets文件夹加载html文件和调用之间应该有一段时间间隔javascript:method
.在这里我调用它onOptionsItemSelected
并且它工作正常..如果我移动 webView.loadUrl("javascript:fieldsOnDelete('name');");
到onCreate()方法的末尾,它显示它无法找到fieldsOnDelete()
方法的错误...
希望能帮助到你...
EDIT3:
在代码中替换以下内容
webView.loadUrl("javascript:alert(javascript:fieldsOnDelete())");
Run Code Online (Sandbox Code Playgroud)
同
webView.loadUrl("javascript:alert(fieldsOnDelete())");
Run Code Online (Sandbox Code Playgroud)
并试试......
归档时间: |
|
查看次数: |
17674 次 |
最近记录: |