Android ResourcesNotFoundException问题:自定义Parcelable对象传值后颜色设置异常
解决Parcelable对象传递后设置背景色出现的ResourcesNotFoundException问题
结合你给出的代码场景,这个异常大概率是颜色值类型不匹配或者Parcelable序列化错误导致的,我给你拆解下原因和对应的解决办法:
可能的原因
- 颜色选择器返回的不是直接的ARGB颜色值,而是Android资源ID(比如
R.color.red对应的整数),直接调用setBackgroundColor()时,系统会把这个整数当成资源ID去查找,自然找不到对应的资源就抛出异常。 - 你的
sub对象在Parcelable序列化/反序列化过程中,color字段没有被正确读写,导致传递后拿到的是无效值(比如错误的资源ID或者未初始化的默认值)。
具体解决方案
1. 先校验并转换颜色值类型
在onColorSelected方法里,先判断返回的color是资源ID还是直接的颜色值,再做对应处理:
override fun onColorSelected(dialogId: Int, color: Int) { // Android资源ID的起始范围是0x7f000000,可以用这个判断是否是资源ID val actualColor = if (color >= 0x7f000000) { // 如果是资源ID,先转换成实际的ARGB颜色值 resources.getColor(color, this.theme) } else { // 已经是直接的颜色值,直接使用 color } sub.color = actualColor createsub_rel.backgroundColor = actualColor }
如果用的是第三方颜色选择库,建议去查下它的文档,确认是否可以配置返回直接的颜色值,这样就不用额外判断了。
2. 检查Parcelable对象的序列化逻辑
确保你的sub类的Parcelable实现中,color字段被正确读写,比如:
class Sub : Parcelable { var color: Int = 0 // 默认可以设为一个合法的颜色值,比如Color.WHITE constructor(parcel: Parcel) : this() { // 读取color字段 color = parcel.readInt() } override fun writeToParcel(parcel: Parcel, flags: Int) { // 写入color字段 parcel.writeInt(color) } override fun describeContents(): Int = 0 companion object CREATOR : Parcelable.Creator<Sub> { override fun createFromParcel(parcel: Parcel): Sub = Sub(parcel) override fun newArray(size: Int): Array<Sub?> = arrayOfNulls(size) } }
如果这里遗漏了color的读写,传递后的sub.color会是默认值0,虽然0本身是黑色,但如果是其他无效值就会触发异常。
3. 替代方案:使用backgroundTintList设置背景色
如果你不想纠结颜色值类型,可以用backgroundTintList来设置,它对颜色值的兼容性更好,不会把整数当成资源ID解析:
createsub_rel.backgroundTintList = ColorStateList.valueOf(actualColor)
调试小技巧
可以在onColorSelected里加一行日志,打印color的值:
Log.d("ColorDebug", "Selected color value: $color")
如果打印的是类似2131099648这种大整数,那就是资源ID;如果是-16777216(对应黑色)这种负数,就是直接的ARGB颜色值,这样能快速定位问题所在。
内容的提问来源于stack exchange,提问作者Daniele
相关产品推荐
相关产品推荐

