如何获取return字符串在Android中的javascript函数?
How to get the javascript function that return string in Android?
我想在我的 android 应用程序中从 JavaScript 函数中烘烤一个 return 字符串,我已经搜索并尝试了几天的代码,但似乎我得到了找不到正确的运气。
这里是我要在android中调用到return一个字符串值
的JS函数
function myFunction()
{
var str= document.getElementsByName('txt')[0].value;
window.android.myFunction(str);
}
MainActivity.java
//create interface
JsInterface jsInterface = new JsInterface();
wv.setWebViewClient(new WebViewClient());
wv.setWebChromeClient(new WebChromeClient());
wv.getSettings().setJavaScriptEnabled(true);
//add interface
wv.addJavascriptInterface(jsInterface, "android");//android is the keyword that will be exposed in js
//load file
wv.loadUrl("file:///android_asset/test.html");
Toast.makeText(getApplicationContext(), myFunction(), Toast.LENGTH_LONG);
}
//javascript interface
private class JsInterface{
public String myFunction(String msg){
return msg;
}
}
我是这种平台的新手,也是Javascript。我感谢那些会回答的人。谢谢。
我认为您需要对代码进行以下更改:
运行 WebViewClient.onPageFinished
中的 Java 脚本函数以确保文档已实际加载,并且为了 运行 它,使用 loadUrl()
函数和 javascript:
URL:
wv.setWebViewClient(new WebViewClient() {
@Override
void onPageFinished(WebView view, String url) {
view.loadUrl("javascript:myFunction();void(0);");
}
}
用 @JavascriptInterface
注释注释要公开的 Java 方法(并将其设为 void
,因为您实际上不想 return 返回 JavaScript),并从其中调用 Toast.makeText()
,但确保切换到 UI 线程,因为注入了 Java 方法 运行 在专用后台线程上:
private class JsInterface {
private Context mContext;
JsInterface(Context context) {
mContext = context;
}
@JavascriptInterface
public void myFunction(String msg) {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
Toast.makeText(mContext, msg, Toast.LENGTH_LONG);
}
});
}
}
并在创建时将应用程序上下文传递给 JsInterface
:
JsInterface jsInterface = new JsInterface(getApplicationContext());
另请注意,您的 Java 脚本中有两个名为 myFunction
的函数:一个在注入对象中,可通过 android.myFunction()
访问,另一个是您自己定义的,它仅作为 myFunction()
或 window.myFunction()
提供。其实还是用不同的名字比较好,以免混淆。
我想在我的 android 应用程序中从 JavaScript 函数中烘烤一个 return 字符串,我已经搜索并尝试了几天的代码,但似乎我得到了找不到正确的运气。
这里是我要在android中调用到return一个字符串值
的JS函数function myFunction()
{
var str= document.getElementsByName('txt')[0].value;
window.android.myFunction(str);
}
MainActivity.java
//create interface
JsInterface jsInterface = new JsInterface();
wv.setWebViewClient(new WebViewClient());
wv.setWebChromeClient(new WebChromeClient());
wv.getSettings().setJavaScriptEnabled(true);
//add interface
wv.addJavascriptInterface(jsInterface, "android");//android is the keyword that will be exposed in js
//load file
wv.loadUrl("file:///android_asset/test.html");
Toast.makeText(getApplicationContext(), myFunction(), Toast.LENGTH_LONG);
}
//javascript interface
private class JsInterface{
public String myFunction(String msg){
return msg;
}
}
我是这种平台的新手,也是Javascript。我感谢那些会回答的人。谢谢。
我认为您需要对代码进行以下更改:
运行
WebViewClient.onPageFinished
中的 Java 脚本函数以确保文档已实际加载,并且为了 运行 它,使用loadUrl()
函数和javascript:
URL:wv.setWebViewClient(new WebViewClient() { @Override void onPageFinished(WebView view, String url) { view.loadUrl("javascript:myFunction();void(0);"); } }
用
@JavascriptInterface
注释注释要公开的 Java 方法(并将其设为void
,因为您实际上不想 return 返回 JavaScript),并从其中调用Toast.makeText()
,但确保切换到 UI 线程,因为注入了 Java 方法 运行 在专用后台线程上:private class JsInterface { private Context mContext; JsInterface(Context context) { mContext = context; } @JavascriptInterface public void myFunction(String msg) { new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { Toast.makeText(mContext, msg, Toast.LENGTH_LONG); } }); } }
并在创建时将应用程序上下文传递给
JsInterface
:JsInterface jsInterface = new JsInterface(getApplicationContext());
另请注意,您的 Java 脚本中有两个名为 myFunction
的函数:一个在注入对象中,可通过 android.myFunction()
访问,另一个是您自己定义的,它仅作为 myFunction()
或 window.myFunction()
提供。其实还是用不同的名字比较好,以免混淆。