我创建了一个自定义小部件,我在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。
答案 0 :(得分:349)
我明白了!答案是 NOT 在样式中指定命名空间。
<?xml version="1.0" encoding="utf-8" ?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="CustomStyle">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="custom_attr">value</item> <!-- tee hee -->
</style>
</resources>
答案 1 :(得分:40)
上面的答案对我有用,我尝试了一个小小的改变,我在资源元素中声明了一个类的风格。
<declare-styleable name="VerticalView">
<attr name="textSize" format="dimension" />
<attr name="textColor" format="color" />
<attr name="textBold" format="boolean" />
</declare-styleable>
在 declare-styleable 中, name 属性引用了一个类名,所以我有一个视图类调用“com.my.package.name.VerticalView”,它表示此声明必须在VerticalView或VerticalView的子类中使用。所以我们可以声明这样的风格:
<resources>
<style name="verticalViewStyle">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">36dip</item>
<item name="textSize">28sp</item> <!-- not namespace prefix -->
<item name="textColor">#ff666666</item>
<item name="textBold">true</item>
</style>
</resources>
这就是为什么我们没有在资源元素中声明命名空间,它仍然可以工作。
答案 2 :(得分:8)
Styler和vince的修改对我有用。我想指出@ vince的解释可能不完全准确。
为了验证与自定义视图类名称匹配的declare-styleable
的name属性允许我们在没有命名空间的情况下访问自定义属性的假设,我更改了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
的某种内省。
因此,我被认为可以使用任何自定义属性来声明样式而不引用命名空间。
无论如何,感谢所有帮助人员,它解决了我的问题。
答案 3 :(得分:5)
<强>值/ styles.xml 强>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
...
<item name="defaultButtonColor">@color/red</item>
<item name="defaultButtonHeight">@dimen/dp_100</item>
</style>
<强>值/ attrs.xml 强>
<resources>
<attr name="defaultButtonColor" format="reference" />
<attr name="defaultButtonHeight" format="reference"/>
</resources>
<强>值/ colors.xml 强>
<resources>
<color name="red">#f00</color>
</resources>
<强>值/ dimens.xml 强>
<resources>
<dimen name="dp_100">100dp</dimen>
</resources>
是强>
<Button
android:layout_width="wrap_content"
android:layout_height="?attr/defaultButtonHeight"
android:text="Button"
android:textColor="?attr/defaultButtonColor"
/>
答案 4 :(得分:1)
如果它对其他人有帮助,我的错误就是我的自定义视图类正在调用AttributeSet.getAttributeValue,例如
String fontName = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto", "customFont");
...这导致我的自定义属性未被自定义视图读入。
修复方法是在我的自定义视图中使用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(而不是通过样式)传递时工作正常。
答案 5 :(得分:0)
<declare-styleable name="refreshPullRefreshLayout">
<attr name="refreshColors" format="reference"/>
<attr name="refreshColor" format="reference"/>
</declare-styleable>
<com.aolphn.PullRefreshLayout
app:refreshColor="@color/main_green"
app:refreshColors="@array/refresh_color"/>
app:
<style name="refreshStyle">
<item name="refreshColor">@color/main_green</item>
<item name="refreshColors">@array/refresh_color</item>
</style>
尝试一下,祝你今天愉快,这对我有用。