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

Android/Kotlin 按主题设置Fragment文本颜色出现Resources$NotFoundException报错如何解决

问题根因

报错的核心原因是参数类型不匹配:
Context.getColor()方法仅接收R.color.xxx格式的颜色资源ID,而你的getColorByThemeAttr()方法返回的是已经解析完成的ARGB颜色整型值(如报错中的0xff000000是纯黑色的实际色值,并非资源ID),系统无法根据实际色值找到对应的资源文件,因此抛出Resources$NotFoundException。

修复代码

直接去掉else分支多余的getColor()包裹,同时优化工具方法的默认值处理逻辑:

bind.scrollDate.setTextColor(
    if (day.date == selectedDate) {
        requireContext().getColor(R.color.white)
    } else {
        getColorByThemeAttr(requireContext(), R.attr.txtcolor, R.color.txtcolor)
    }
)

// 根据主题属性获取对应颜色
private fun getColorByThemeAttr(context: Context, attr: Int, defaultColorRes: Int): Int {
    val typedValue = TypedValue()
    val got = context.theme.resolveAttribute(attr, typedValue, true)
    return if (got) {
        typedValue.data
    } else {
        // 默认值为资源ID,需要转换为实际色值返回
        context.getColor(defaultColorRes)
    }
}

补充优化建议

  • Fragment中优先使用requireContext()获取上下文,相比view.context稳定性更高,可避免View被移除时出现空指针问题
  • 如需兼容更低系统版本,可替换为ContextCompat.getColor(context, 资源ID)获取颜色
  • 如需适配点击、选中等多状态颜色,可使用setTextColor(ContextCompat.getColorStateList(context, 资源ID))方法

内容的提问来源于stack exchange,提问作者madhall

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:30:05