【发布时间】:2013-02-13 01:03:50
【问题描述】:
我将发布对我的应用程序的更新以使用新的 JavaScript Google Charts API,并注意到针对 Google Image Charts API 的弃用警告。我遇到了轴标签的 JavaScript 问题,显然取决于 Android WebKit 的版本。我知道在 3.1 之前使用 Google Charts API 根本行不通,因为 Webkit 客户端缺乏 SVG 支持。
背景
该应用程序目前支持 Eclair(API 级别 7)向上,SVG 支持仅到达 Honeycomb MR1(API 级别 12)中内置的 WebKit 客户端。为了解决这种功能上的差异,我的代码使用了一个简单的 if-else 语句来检查 Android 版本,然后再决定使用哪个图表 API。
渲染问题
最好用图片来展示。请注意;
- Android Honeycomb Emulator 上运行的 JavaScript 与 Jelly Bean 设备上运行的 JavaScript 相同。
- 比较的是模拟器(不工作)和真实手机(工作)
- JavaScript 正在利用内置
android.webkit.WebViewClient从 WebView 中运行 - 模拟器上的轴显示为
[Object object],但在真实设备上正确显示
图 1 - 在 Honeycomb 仿真器上发现不正确的轴标签。
图 2 - 在真实设备上找到的正确轴标记。
代码
如果没有“粘贴轰炸”的大量无关代码的问题,驱动垂直 (v) 轴命名的 JS 和 Java 位如下所述;
JavaScript
...
As part of the chart options...
...
// Vertical axis.
vAxis: {title: yAxisTitle.toString(),
baselineColor: 'white',
titleTextStyle: {color: 'gray'},
textStyle: {color: 'gray'},
gridlines: {color: 'gray'}
}
yAxisTitle 已通过 Android WebView.addJavascriptInterface 注入其中;
Java
chart.addJavascriptInterface(String.format(getString(string.height_label), getUnits().getSymbol()), "yAxisTitle");
迄今为止的调查
从之前简单地遇到[Object object] 描述(我是 JS 世界的新手),我了解到我只是在 JavaScript 对象上执行一个 toString,这就是它的样子。但这是否意味着 Android 3.1 和 4.1 之间的 Java-JavaScript 注入发生了变化,这意味着通过 addJavascriptInterface 注入的数据类型现在被“记住”了,而以前没有?我应该将字符串序列化为 JSON 对象,还是对于传递(几乎)原始类型的内容来说太过分了?最后,我是否应该在 JS 端显式强制转换以强制用于诸如轴标签之类的项目的对象类型确实是字符串?想法表示赞赏。
【问题讨论】:
标签: javascript android google-visualization