Android自定义小部件样式:如何将它们放入命名空间中?

17

在ApiDemos中,有一个名为Gallery1的视图示例,在attrs.xml中声明了一个自定义样式,如下所示:

<declare-styleable name="Gallery1">
    <attr name="android:galleryItemBackground" />
</declare-styleable>

现在,我想为我的小部件做同样的事情,但使用不同的命名空间。然而,一旦我将 android: 命名空间替换为其他内容,就会出现以下错误:

错误:在 Gallery1 中,无法找到属性 myns:galleryItemBackground

找不到属性?为什么它要查找我即将声明的属性?这个文件的目的不是能够命名自己的自定义属性吗?

有趣的是,如果您不提供自定义命名空间,而只提供属性名称,则可以正常工作。

4个回答

22

我遇到了类似的问题,导致出现错误信息"No resource identifier found for attribute in package"

我的解决方法是在使用自定义属性时声明命名空间。

在你使用自定义属性的xml文件中指定:

xmlns:myns="http://schemas.android.com/apk/res-auto"

...

<gallery.widget.package.Gallery1


myns:myCustomAttr="xxx"
/>

1
我为过去的两个小时奋斗终于在这里结束了。 - Signcodeindie
嘿,我怎么知道哪个是我的命名空间?我的意思是你的是xmlns:myns,那我的是什么? - Alan Deep

8

如果有人还感兴趣,我曾遇到同样的问题,并通过添加'format'属性来解决它(似乎不以'string'为默认值):

<attr name="android:galleryItemBackground" format="integer"/>

“Clean project”:清理项目 - JRun

1

创建一个 XML 文件,将以下代码复制并粘贴到 res->values 文件夹中

<declare-styleable name="Gallery1">
    <attr name="android:galleryItemBackground" />
</declare-styleable>

然后复制下面的代码

TypedArray typedArray=this.obtainStyledAttributes(R.styleable.Gallery1);
        int back=typedArray.getResourceId(R.styleable.Gallery1_android_galleryItemBackground, 0);
        typedArray.recycle();

并将其设置为您的小部件背景,我的意思是 imageView.setBackgroundResource(back);


1

我发现this文章在类似情况下很有帮助。

“引用我们的新属性实际上是一个两步过程。首先,我们声明了一个新的命名空间,然后我们在XML使用中指定了我们新属性的值。”


我已经阅读了那篇文章,但是它已经过时且是错误的(它根本不再有效,至少现在不是这样)。 - mxk
这篇文章在Android 1.6上运行良好[已测试]。 但是我误解了你的问题。在声明styleable时,您将无法指定任何命名空间,因为它已经在您的应用程序命名空间中。当您或其他人需要在Layout XML中使用attrs时,他们需要使用您的应用程序命名空间。就像我们使用android指定的attrs一样,使用android:attr。 - bhatt4982
我认为问题可能与我从另一个项目引用这些样式有关。也就是说,我在项目A中声明了attrs.xml,从中创建了一个JAR文件,并尝试在另一个项目B中访问它们。我总是得到“找不到属性X的资源标识符”。如果不使用样式化属性而使用普通属性,则可以正常工作。 - mxk
注意:A项目中的R类已经在JAR中导出,并且它包含可定制属性ID。不知道为什么B无法看到它。 - mxk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接