如何将JavaScript函数的返回值传递给Android?

12

我想让我的 Android 应用程序调用由 JavaScript 编写的函数,并期望从中返回值。

我了解到 WebView.loadUrl 是异步工作的,所以现在我正在让 JavaScript 在完成时通知我的 Android 应用程序,并通过使用 javascriptinterface 调用 Java 函数来传递返回值。

我想知道是否有更好的方法来做到这一点,是否有人注意到 JavaScript 和 Android 之间存在信息丢失。


1个回答

31

我明白了你的问题。

像这样有一个JS函数。

function androidResponse() {
   window.cpjs.sendToAndroid("I am being sent to Android.");
}

设置Android(Java)。

编写一个最终类如下:

final class IJavascriptHandler {
   IJavascriptHandler() {
   }

   // This annotation is required in Jelly Bean and later:
   @JavascriptInterface
   public void sendToAndroid(String text) {
      // this is called from JS with passed value
      Toast t = Toast.makeText(getApplicationContext(), text, 2000);
      t.show();
   }
}

在您的 WebView 加载时执行。

webView.addJavascriptInterface(new IJavascriptHandler(), "cpjs");

调用JS函数

webView.loadUrl("javascript:androidResponse();void(0)");

更新


我曾经遇到过一个非常糟糕的问题,就是从Java传递数百行字符串到JS时出现问题。我在StackOverflow上发布了相关问题,但没有得到好的答案。最终我解决了这个问题,发现问题出在字符串中的特殊字符,因此在传递字符串时要注意特殊字符。

从Javascript传递数据到Android WebView

嵌套字符串中的HTML字符串

Android WebView中HTML TextArea字符限制


现已编辑,我现在理解了问题。 - Umair A.
这很明显,一个是异步的,另一个是同步的,但我还没有阅读文档。我的工作更多地是将大量HTML数据从Java发送到JS,并且我发现由于HTML长字符串中的特殊字符而导致了数据丢失,并且我也发现我们不能只是使用webView.loadUrl("...")传递大量HTML字符串,所以我想出了一个解决方法。 - Umair A.
1
哪些字符会引起问题?“巨大”有多大? - Robert Siemer
@Neutralizer你的回答很有用,但我有一个小问题,我的webview有几个本地html文件要显示,其中一个必须从(我的)远程服务器读取和加载json数据,而本地资产文件夹中的html文档在所有数据都被读取之前不会显示。似乎js函数androidResponse(我在这里遵循了你的答案)直到webview完全加载html后才会被调用。如果我第二次点击调用androidResponse的按钮,那么TOAST消息现在就会显示。你能想出问题所在吗? - JoeCoolman
我知道这个问题已经四年了,但我想知道有没有人找到一种从Android传输大量数据到JS的方法? - X-HuMan
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接