我正在将Web应用程序迁移到Android版本。 在收到并处理了JSON数据之后,我在页面中保存了一组Javascript对象。
如何将其中一个javascript对象“out”的完整内容传递给webview容器,以便使用本机android控件进行显示?
最终,我可以使用一个方法创建一个javascript界面,该方法具有每个可能的javascript对象属性的参数 - 但这似乎过于沉重。
任何人都可以帮忙吗?
答案 0 :(得分:15)
Android的WebView
包含一个名为addJavascriptInterface(Object obj, String interfaceName)
的方法,在这里应该很有用。
使用此方法,可以通过Web视图中的JavaScript代码访问作为界面添加的对象obj
。在您的情况下,您可以传入一个具有setter方法的对象,该方法将一些JavaScript对象传回Java。
您仍然需要创建将JavaScript对象转换为JSON对象的粘合代码。对于快速方法,您可以使用从JavaScript传递的JSON字符串让您的接口在Java端生成JSONObject。 Java中的JSONObject
类有一个构造函数,它接受包含JSON数据的String。因此,您可以将字符串化结果直接传递回Java并以此方式创建对象。例如:
class JSInterface {
HashMap<String, JSONObject> mObjectsFromJS = new HashMap<String, JSONObject>();
public void passObject(String name, String json) {
mObjectsFromJS.put(name, new JSONObject(json));
}
}
//At some point, register using:
mJSInterface = new JSInterface();
mWebView.addJavascriptInterface(mJSInterface, "Android");
然后,在JavaScript方面,在变量jsonData中有一小块未解析的JSON的处理程序中:
Android.passObject("pageItems", jsonData);
现在,Java端的JSInterface将包含一个包含项的JSONObject,您可以使用JSONObject提供的getter访问这些项。通过Javascript调用创建的对象将位于mObjectsFromJS
地图中。您当然希望向JSInterface类添加其他辅助方法,以便更好地管理对象。
我没有编译或测试过任何这些方法,因此您可能需要稍微调整一下才能正常运行。但希望这会给你一个想法。
但是,如果对象具有一致的接口和数据项,那么创建一个简单的JavaScript粘合函数会更加明智,该函数使用setter方法将JavaScript对象属性绑定到Java端对象字段。
请注意
这使远程代码能够触发设备上的本机代码。如果您无法完全控制加载到WebView
中的页面/脚本,则应确保obj
公开的行为不允许任何漏洞利用。