Android自定义View分隔符配置背景selector时抛出InflateException异常
问题根因
异常由资源类型不匹配直接触发:
- 你存放在
res/color路径下的field_underline_color.xml属于ColorStateList(颜色状态列表)资源,这类资源仅支持赋值给接收纯颜色值的属性,例如android:textColor。 android:background属性要求传入Drawable类型资源,你通过@color/field_underline_color引用ColorStateList时,系统无法自动将ColorStateList实例转换为Drawable类型,反射创建View执行background赋值逻辑时会抛出类型转换异常,被反射机制包装为InvocationTargetException,最终触发布局inflate失败。- 替换为静态颜色值时无异常,是因为系统会自动将int类型的纯色值包装为
ColorDrawable实例,符合background属性的参数类型要求。
问题复现点
field_underline.xml中的错误引用写法:
<View xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/field_underline_color" />
你当前编写的field_underline_color.xml是ColorStateList结构,item节点使用android:color属性配置颜色,本身不属于Drawable资源。
修复方案
推荐直接将颜色选择器调整为Drawable类型的状态选择器,步骤如下:
- 将
field_underline_color.xml从res/color目录移动到res/drawable目录 - 将所有item节点的
android:color属性替换为android:drawable属性 - 布局中引用路径改为
@drawable/field_underline_color
修改后的Drawable selector示例:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="200" android:enterFadeDuration="200"> <item android:state_enabled="false" android:state_checked="false" android:state_activated="false" android:alpha="0.4" android:drawable="@color/content_50" /> <item android:state_enabled="true" android:state_checked="true" android:state_activated="false" android:alpha="1" android:drawable="@color/invalid" /> <item android:state_enabled="true" android:state_checked="false" android:state_activated="true" android:alpha="1" android:drawable="@color/primary" /> <item android:alpha="1" android:drawable="@color/content_50"/> </selector>
修改后重新编译运行即可正常加载,你配置的状态切换、淡入淡出动画效果都可以正常生效。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

