传入0调用ContextCompat.getColor触发Resource NotFound Exception求助
问题根因
ContextCompat.getColor() 方法要求传入的第二个参数必须是合法的Android颜色资源ID,也就是类似R.color.xxx这种由编译工具自动生成的非0整数ID。当你传入0时,系统会尝试查找ID为0x0的资源,这类资源不存在,就会直接抛出Resources$NotFoundException异常,触发崩溃。
可行解决方案
- 方案1:直接使用系统颜色常量(无需走资源加载,性能最优)
如果你需要的兜底值是固定颜色,可直接调用android.graphics.Color类的内置常量传入setTextColor,不需要嵌套ContextCompat.getColor:
// 示例:兜底为黑色 findViewById<TextView>(R.id.text_view).setTextColor(Color.BLACK) // 示例:兜底为透明 findViewById<TextView>(R.id.text_view).setTextColor(Color.TRANSPARENT)
- 方案2:提前判断资源ID有效性,走兜底逻辑
保留原有switch分支逻辑的前提下,对资源ID做非0判断,0值时返回自定义兜底颜色:
val targetColorRes = when(你的判断条件) { // 原有分支返回对应R.color.xxx资源ID else -> 0 } val finalTextColor = if (targetColorRes == 0) { // 自定义兜底颜色,也可以填Color.parseColor("#xxxxxx")自定义色值 Color.BLACK } else { ContextCompat.getColor(applicationContext, targetColorRes) } findViewById<TextView>(R.id.text_view).setTextColor(finalTextColor)
- 方案3:异常捕获兜底(不推荐,仅兼容不可控的资源ID传入场景)
如果无法提前判断资源ID有效性,可以主动捕获异常避免崩溃:
val finalTextColor = try { ContextCompat.getColor(applicationContext, targetColorRes) } catch (e: Resources.NotFoundException) { Color.BLACK // 异常时返回兜底色 } findViewById<TextView>(R.id.text_view).setTextColor(finalTextColor)
内容的提问来源于stack exchange,提问作者kashyap
相关产品推荐
相关产品推荐

