创建自定义属性时出现“No resource found that matches the given name”错误
问题原因与解决办法
这个问题我之前也踩过坑,根源很明确:你给enum定义的name属性里包含了冒号(:),这违反了Android资源系统的命名规则。
Android的资源体系里,冒号是有特殊用途的——它用来区分自定义属性的命名空间(比如布局里写app:columns_ratio="xxx"时,app:就是命名空间前缀),同时资源命名本身也不允许包含冒号这种特殊符号。当你把1:1、1:2这类值作为enum的name时,编译系统会错误地把冒号前后的内容解析成「资源类型:资源名称」的结构,它会尝试去查找id为1的资源类型下名为1、2的资源,这显然不存在,所以就抛出了processDebugResources的异常。
修复方案
把enum的name改成不含冒号的合法命名就行,比如用下划线替代冒号,或者直接用更清晰的命名:
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="my_image"> <attr name="columns_ratio" format="enum"> <enum name="ratio_1_4" value="3"/> <enum name="ratio_1_3" value="2"/> <enum name="ratio_1_2" value="1"/> <enum name="ratio_1_1" value="0"/> </attr> </declare-styleable> </resources>
之后在布局里引用的时候,就用你修改后的name值:
<com.yourpackage.MyImageView app:columns_ratio="ratio_1_1" <!-- 其他属性 --> />
如果需要在界面或者日志里显示1:1这种格式,完全可以在代码里做映射:比如拿到columns_ratio的value后,用一个Map把0对应到"1:1",1对应到"1:2",以此类推,这样既符合资源命名规则,又能满足显示需求。
内容的提问来源于stack exchange,提问作者etrusks
相关产品推荐
相关产品推荐

