我已经创建了一个自定义小部件,并在layout.xml中声明它。我还在attr.xml中添加了一些自定义属性。但是,当尝试在styles.xml中的样式中声明这些属性时,我得到的是No resource found that matches the given name: attr 'custom:attribute'.
我已经将xmlns:custom="http://schemas.android.com/apk/res/com.my.package"
放到了styles.xml中的所有标记中,包括<?xml>
、<resources>
和<style>
,但是它仍然给我同样的错误,即它找不到我定制的XML名称空间。
但是,我可以使用我的名称空间为layout.xml中的视图手动分配属性,因此名称空间没有任何问题。我的问题在于让styles.xml知道我的attr.xml。
发布于 2013-10-31 00:15:01
斯泰勒和文斯的修改对我很有效。我想指出的是,“文斯”的解释可能并不完全准确。
为了测试这样一个假设,即与自定义视图类的名称相匹配的declare-styleable
的名称属性允许我们在没有命名空间的情况下访问自定义属性,我更改了declare-styleable
的名称(自定义视图被命名为TestViewFont
<declare-styleable name="TextViewFont2">
<attr name="font" format="integer"/>
</declare-styleable>
然后,我在自定义视图中更改了obtainStyledAttributes
调用,以反映这一点:
TypedArray ta = context.getTheme().obtainStyledAttributes(attrs, R.styleable.TextViewFont2, 0, 0);
代码仍然在运行。因此,我不认为这是由它命名的类的declare-styleable
进行的某种自省。
因此,我相信任何自定义属性都可以用于声明样式,而无需引用名称空间。
不管怎样,感谢大家的帮助,它解决了我的问题。
发布于 2014-12-13 10:52:09
为了防止它对其他人有帮助,我的错误是我的自定义视图类调用了AttributeSet.getAttributeValue。
String fontName = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto", "customFont");
...which导致我的自定义属性不能被读入我的自定义视图。
修复方法是在我的自定义视图中使用obtainStyledAttributes
:
TypedArray styleAttrs = context.obtainStyledAttributes(attrs, R.styleable.MyTextViewStyleable);
String fontName = styleAttrs.getString(R.styleable.MyTextViewStyleable_customFont);
这一功能正常工作的一个提示是,您可以在按住Ctrl/Apple键的同时单击R.styleable.MyTextViewStyleable_customFont
,直接转到您的attrs.xml定义。
我花了一段时间才发现我的代码与其他示例之间的关键区别,因为当直接通过布局XML (而不是通过样式)传递自定义属性时,它工作得很好。
https://stackoverflow.com/questions/6860886
复制相似问题