在JavaScript和android的WebView之间传递复杂数据

时间:2018-02-14 10:53:04

标签: javascript android webview

我试图为js和android的WebView之间的交互编写一些代码。
已阅读Building Web Apps in WebView
我现在的目标是从js获取一些数据。我找到的适当例子是

Android代码:

<input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" />
<script type="text/javascript">
  function showAndroidToast(toast) {
    Android.showToast(toast);
  }
</script>

HTML + JS:

"Uncaught Error: Java exception was raised during method invocation", source: file:///android_asset/test.html (34)

并且......它与原始数据(字符串,整数......)以及原始数据数组

完美配合

但是当我尝试传递复杂对象时,如下所示,它会导致Java异常private class Data { String a; String b; } public class WebAppInterface { /** Show a toast from the web page */ @JavascriptInterface public void showToast(Data data) { Toast.makeText(getContext(), data.a + data.b, Toast.LENGTH_SHORT).show(); } }

Android代码:

<input type="button" value="Say hello" onClick="showAndroidToast()" />
<script type="text/javascript">
  var data = {a: "Hello ", b: "world"};
  function showAndroidToast() {
    Android.showToast(data); // exception
  }
</script>

HTML + JS:

Users.RoleId

我认为这是因为WebView无法定义将JS数据类型转换为Java数据类型的方式(原始类型除外)。

你能告诉我在JS和android的WebView之间传递复杂数据类型的方法吗?

2 个答案:

答案 0 :(得分:1)

我找到了唯一简单的方法:使用JSON.stringify()将此数据作为json传递:

<input type="button" value="Say hello" onClick="showAndroidToast()" />
<script type="text/javascript">
  var array = [1, 2, 3];
  function showAndroidToast() {
    Android.showToast(JSON.stringify(array)); // "[1, 2, 3]"
  }
</script>

那么,在我的Java代码中,我可以使用json解析器以适当的方式表示数据

答案 1 :(得分:0)

showToast期待一个String,而不是一个数组。

您需要创建一个新方法来接受您想要的数据类型,例如showToast(ArrayList<String> array)showToast(String[] array)

修改

由于问题现已编辑为更具体,我正在更新我的答案。

在JavaScript和Java之间传递自定义对象可以按如下方式进行:

public void showToast(String stringData) {
    Data data = new Gson().fromJson(stringData, Data.class);
    // do what you want with the new Data object
}

这使用Gson库。您可以使用Android中使用的默认JSON类,但Gson可以很好地映射自定义对象。我没有遇到任何问题。

然后,您想使用重新发送的答案Android.showToast(JSON.stringify(array));将其传递给Java方法。

我建议现在调用自定义对象Data,因为它的语义不具体,很容易导致混淆。

Here有一个很好的例子,可以将JSON数组转换为字符串(例如,从JavaScript中)转换为自定义对象的列表。