You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MPAndroidChart点击图表闪退及X轴时间刻度间隔设置问题

问题解决方案

1. 点击图表闪退修复

闪退核心原因是onCreate生命周期中提前为未初始化数据的图表绑定了Marker:

  • 现有代码在onCreate末尾直接给lineChart设置marker,此时还未加载CSV数据,图表数据为空,点击触发Marker绘制时会触发空指针异常。
  • 修复方案:
    1. 删除onCreate末尾的两行Marker初始化代码,将其移到CSV数据加载完成、给lineChart设置完LineData之后执行
    2. 给toEntry方法加异常捕获,避免CSV格式异常导致的类型转换崩溃
    3. 可选:给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轴的数值单位为分钟,按如下配置即可实现需求:

  1. 放开代码中注释的两行X轴配置,额外补充labelCount和颗粒度开关配置
  2. 实现自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 15:00:03