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
相关产品推荐
相关产品推荐

