Android Studio中AnyChart无法接收变量传入ValueDataEntry的问题
AnyChart饼图变量传参失效问题解决
问题现象
在Android Studio中开发饼图功能时,直接向ValueDataEntry传入41、56、93这类整数字面量时功能正常,代码如下:
data.add(new ValueDataEntry("BUB", 41)); data.add(new ValueDataEntry("KP", 56)); data.add(new ValueDataEntry("SP", 93));
但传入int/float/double类型的数值变量时,无任何编译、运行报错,饼图始终无法正常渲染,此前使用MPAndroidChart开发时也遇到过完全相同的问题。
失效的测试代码如下:
private void makeChart() { ArrayList<DataEntry> data= new ArrayList<>(); int test=41; int test2=56; int test3=93; data.add(new ValueDataEntry("BUB", test)); data.add(new ValueDataEntry("KP", test2)); data.add(new ValueDataEntry("SP", test3)); Pie pie = AnyChart.pie(); pie.data(data); anyChart.setChart(pie); }
根本原因
ValueDataEntry的数值参数实际接收的是Number抽象类的子类(即Integer、Float、Double等包装类型),不直接支持基本数据类型。
直接传入整数字面量时,Java编译器会自动完成装箱操作,将字面量转为Integer类型匹配构造方法,所以可以正常运行。但在部分版本的AnyChart、MPAndroidChart中,泛型类型擦除机制会导致基本类型变量的隐式装箱结果无法被图表组件的参数校验逻辑识别,会被当做无效空值过滤,不会触发异常但会导致图表渲染失败。
修复方案
- 传参时手动完成基本类型到包装类型的转换,不依赖隐式自动装箱:
// 手动转为Integer包装类型传入 data.add(new ValueDataEntry("BUB", Integer.valueOf(test))); data.add(new ValueDataEntry("KP", Integer.valueOf(test2))); data.add(new ValueDataEntry("SP", Integer.valueOf(test3)));
- 如果是获取用户输入的数值,先完成字符串到数值的解析,再传入包装类型对象,不要直接传入原始基本类型变量。
- 如果手动装箱后依然无效,检查当前使用的AnyChart依赖版本,部分低版本SDK存在基本类型传参识别bug,升级到稳定版本即可。
这类无报错不渲染的问题在Android图表开发中非常常见:图表组件的Entry类普遍使用Object/Number作为数值参数的泛型类型,类型不匹配时不会触发编译或运行时崩溃,只会静默过滤无效数据,最终表现为图表空白。
内容的提问来源于stack exchange,提问作者Muhammad Arif
相关产品推荐
相关产品推荐

