gpt4 book ai didi

javascript - 我们如何在我们的 android 应用程序中执行 javascript 函数并获取返回值?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:38:01 25 4
gpt4 key购买 nike

我们如何在我们的 android 应用程序中执行 javascript 函数并获取返回值?

我们想在按钮按下事件上执行 javascript,我们需要将参数传递给脚本并获取返回值,所以我们使用“WebChromeClient”来实现它,但是我们得到的异常是“SyntaxError: Parse error at undefined: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;
}
}


}

最佳答案

您可以使用 mWebView.loadUrl("javascript:checkName"); 调用方法...

然后您可以使用 addJavascriptInterface() 将 Java 对象添加到 Javascript 环境中。让您的 Java 脚本调用该 Java 对象的方法以提供其“返回值”。

EDIT1:或者您可以使用以下 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;
}
}

现在在你的 java 脚本调用中做:

webView.loadUrl("javascript:alert(functionThatReturnsSomething)");

现在在 onJsAlert 调用中“message”将包含返回值。

编辑2:

因此,如果我们在调用加载 URL 后立即调用 javascript 方法是行不通的,因为页面加载需要时间。所以我创建了一个测试程序来测试...

以下是我的 html 文件(名为 test.html)存储在 Assets 文件夹中:

<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>

以下是我的 java 类,我将把它作为接口(interface)添加到 java 脚本,它会接收返回值:

public class MyJS {

public void returnValue(String string){
Log.d(this.getClass().getSimpleName(), string);
}

}

下面是我的 Activity 课:

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);
}

}

这里的关键是调用从 assets 文件夹加载 html 文件和调用 javascript:method 之间应该有一些时间间隔。在这里,我从 onOptionsItemSelected 调用它,它工作正常。如果我将 webView.loadUrl("javascript:fieldsOnDelete('name');"); 移动到onCreate() 方法的末尾显示错误,它找不到 fieldsOnDelete() 方法...

希望对你有帮助...

编辑3:

在您的代码中替换以下内容

webView.loadUrl("javascript:alert(javascript:fieldsOnDelete())");

webView.loadUrl("javascript:alert(fieldsOnDelete())");

然后尝试...

关于javascript - 我们如何在我们的 android 应用程序中执行 javascript 函数并获取返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13527624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com