1

我即将发布对我的应用程序的更新,以使用新的 JavaScript Google Charts API,并注意到针对Google Image Charts API的弃用警告。我遇到了轴标签的 JavaScript 问题,显然取决于 Android WebKit 的版本。我知道使用 Google Charts API在 3.1 之前根本无法工作,因为 Webkit 客户端缺乏 SVG 支持。

背景

该应用程序目前支持 Eclair(API 级别 7)向上,SVG 支持仅到达 Honeycomb MR1(API 级别 12)中内置的 WebKit 客户端。为了解决功能上的这种差异,我的代码使用了一个简单的 if-else 语句来检查 Android 版本,然后再决定使用哪个图表 API。

渲染问题

这最好用图片来展示。请注意;

  1. 在 Android Honeycomb Emulator 上运行与在 Jelly Bean 设备上相同的 JavaScript。
  2. 比较是在模拟器(不工作)和真实手机(工作)之间
  3. JavaScript 正在利用内置的 WebView 中运行android.webkit.WebViewClient
  4. 模拟器上的轴在[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

爪哇

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 端显式强制转换以强制用于诸如轴标签之类的项目的对象类型确实是字符串?想法赞赏。

4

1 回答 1

1

我使用控制台记录了我在问题中描述的注入和解析方法WebChromeClient的许多不同排列的结果。我发现该类型在不同版本的 Android 中并没有“丢失”,并且再多的强制转换或其他愚蠢行为也无法纠正所描述的情况。

代替该方法,我注入了一个JSONObject描述轴标题并在 JS 中解析对象。见下文;

爪哇

final JSONObject axes = new JSONObject();
axes.put("yAxisTitle", String.format(getString(string.height_label), getUnits().getSymbol()));
axes.put("zAxisTitle", getString(string.period_label));
chart.addJavascriptInterface(axes, "axes");

JavaScript

vAxis: {title: chartAxes.yAxisTitle,
        baselineColor: 'white',
        titleTextStyle: {color: 'gray'},
        textStyle: {color: 'gray'}, 
        gridlines: {color: 'gray'}
       },

这适用于 Android 版本。经验教训——不要尝试没有 JSON 的 Java-JS 通信,即使数据类型是基本的——这没什么大不了的。

于 2013-02-13T23:38:44.017 回答