我试图为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之间传递复杂数据类型的方法吗?
答案 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中)转换为自定义对象的列表。