可以在android中调用javascript函数吗?
Posted
技术标签:
【中文标题】可以在android中调用javascript函数吗?【英文标题】:It is possible to call a javascript function in android? 【发布时间】:2020-04-30 00:14:10 【问题描述】:我知道我可以在 android 中执行函数并通过 javascript 调用它们,但我不知道是否可以在 android (java) 中调用 javascript 函数。
例如,我在 android 中有一个小应用程序,它打开一个 webview 并在我想要的网站内,当用户点击设备的后退按钮,webview 调用一个 javascript 函数返回到(网站的)上一个操作,如果没有操作,它关闭应用程序而不是going to main activity
。
我知道我可以使用类似的东西:
@Override
public void onBackPressed()
if (mWebView.canGoBack())
mWebView.goBack();
else
finish();
但在我的情况下它不起作用,我需要致电js function
。
有人可以帮忙吗?
【问题讨论】:
【参考方案1】:相信你可以使用
WebView webView = (WebView) findViewById(R.id.webview);
webView.setWebChromeClient(new MyCustomChromeClient(this));
webView.getSettings().setJavaScriptEnabled(true);
webView.evaluateJavascript("globalJavascriptFunction();", null);
https://developer.android.com/reference/android/webkit/WebView#evaluateJavascript(java.lang.String,%20android.webkit.ValueCallback%3Cjava.lang.String%3E)
第二个参数是回调。
[编辑]
要从 javascript 中获取值,您可以执行以下操作:
webView.evaluateJavascript("globalJavascriptFunction();", new ValueCallback<String>()
@Override
public void onReceiveValue(String result)
// result is the return value of globalJavascriptFunction()
// you'll have to do some testing inside here to figure out exactly how result gets sent back for your usecase
);
【讨论】:
Javascript 函数需要特定的地方吗? @CatarinaBatista 通常window.globalJavascriptFunction = function() ...
但是这段代码可以在 MainActivity.java 文件中吗?
@CatarinaBatista webView.evaluateJavascript("globalJavascriptFunction();", null);
假设在您正在呈现的 web 视图的 html + javascript 中的某处,定义了函数 globalJavascriptFunction
。您可以从webView.evaluateJavascript
调用任何全局可访问的函数
如果一个函数有返回值,我怎样才能得到这个值? (在创建要返回的函数之前,我正在尝试对其他现有函数进行测试)【参考方案2】:
可能缺少一些东西... 浏览下面的代码...
WebView webView = (WebView) findViewById(R.id.webview);
webView.setWebChromeClient(new MyCustomChromeClient(this));
webView.setWebViewClient(new MyCustomWebViewClient(this));
webView.clearCache(true);
webView.clearHistory();
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
...
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
if (event.getAction() == KeyEvent.ACTION_DOWN)
switch (keyCode)
case KeyEvent.KEYCODE_BACK:
if (mWebView.canGoBack())
mWebView.goBack();
else
finish();
return true;
return super.onKeyDown(keyCode, event);
【讨论】:
为什么是 onKeyDown?它不应该是 onBackPressed? 用onBackPressed()方法会考虑android循环,用onKeyDown()会考虑webView循环。 它不起作用,因为我正在访问的网站没有历史记录或导航 它适用于我...结帐:drive.google.com/file/d/1HqKJCU_u-Elg_enGqpzAMMI2FBaHAmed/… 如果您仍然发现这不起作用,请分享一些 gradle 代码和清单以获取更多信息... 但我已经尝试使用 google 并且它可以工作,但我正在尝试对我的同事创建的另一个网站做同样的事情,我认为我需要调用 js 函数来做到这一点跨度>以上是关于可以在android中调用javascript函数吗?的主要内容,如果未能解决你的问题,请参考以下文章
Android 在 WebView 中调用 JavaScript 函数
Android Webview 和Javascript交互,实现Android和JavaScript相互调用