MPAndroidChart点击图表闪退及X轴时间刻度间隔设置问题
问题解决方案
1. 点击图表闪退修复
闪退核心原因是onCreate生命周期中提前为未初始化数据的图表绑定了Marker:
- 现有代码在
onCreate末尾直接给lineChart设置marker,此时还未加载CSV数据,图表数据为空,点击触发Marker绘制时会触发空指针异常。 - 修复方案:
- 删除
onCreate末尾的两行Marker初始化代码,将其移到CSV数据加载完成、给lineChart设置完LineData之后执行 - 给
toEntry方法加异常捕获,避免CSV格式异常导致的类型转换崩溃 - 可选:给Marker的绘制逻辑加非空判断,避免数据为空时的异常
- 删除
修复后的核心代码示例:
// getContent回调内修改 val lineChart = findViewById<LineChart>(R.id.lineChart) val vl = LineDataSet(newEntries.toList().take(4000), "cost") // 原有vl属性配置保持不变 vl.setDrawValues(false) vl.setDrawFilled(true) vl.lineWidth = 1.5f vl.fillColor = R.color.gray vl.fillAlpha = R.color.red vl.setDrawCircles(false) lineChart.data = LineData(vl) // 新增:数据加载完成后再绑定Marker val markerView = CustomMarker(this@MainActivity, R.layout.marker_view) lineChart.marker = markerView // 原有图表刷新、动画等逻辑保持不变 lineChart.notifyDataSetChanged() lineChart.animateX(1800, Easing.EaseInExpo)
// toEntry方法增加异常捕获 private fun toEntry(line: String): Entry? { return try { val split = line.split(";") if (split.size >=3) Entry(split[1].toFloat(), split[2].toFloat()) else null } catch (e: Exception) { null } } // 映射数据时过滤空值 val newEntries = lines.mapNotNull { line -> toEntry(line) }.groupingBy { entry -> entry.x } .reduce { _, accumulator, element -> if (accumulator.y > element.y) accumulator else element }.values
2. X轴每60分钟展示刻度修复
假设你X轴的数值单位为分钟,按如下配置即可实现需求:
- 放开代码中注释的两行X轴配置,额外补充
labelCount和颗粒度开关配置 - 实现自定义
MyAxisFormatter将数值转换为时分秒格式
代码示例:
class MyAxisFormatter : ValueFormatter() { override fun getFormattedValue(value: Float): String { // value为分钟数,转换为时分秒格式 val totalSeconds = (value * 60).toLong() val hour = totalSeconds / 3600 val minute = (totalSeconds % 3600) / 60 val second = totalSeconds % 60 return String.format("%02d:%02d:%02d", hour, minute, second) } }
在加载数据完成后给X轴添加如下配置:
lineChart.xAxis.apply { valueFormatter = MyAxisFormatter() isGranularityEnabled = true granularity = 60f // 最小刻度间隔60分钟 // 第二个参数传true强制按间隔生成刻度,第一个参数可按数据最大时长/60计算需要展示的刻度数量 setLabelCount((maxXValue / 60).toInt(), true) }
内容的提问来源于stack exchange,提问作者MaksChojniak
相关产品推荐
相关产品推荐

