【问题标题】:How can I create an AttributeSet from a style.xml?如何从 style.xml 创建 AttributeSet?
【发布时间】:2011-05-23 13:09:43
【问题描述】:

这是我的故事:

我有一个自定义 ViewGroup,我想使用预定义样式从代码创建,到目前为止,我的方法是从 style.xml 元素创建一个 AttributeSet 对象,就像这样(警告,小心前面的复制粘贴代码):

    XmlPullParser parser = getResources().getXml(R.style.my_stylez);
    AttributeSet attributes = Xml.asAttributeSet(parser);

但是这样做时我会遇到一些疯狂的错误: “..android.content.res.Resources$NotFoundException:资源 ID #0x7f090002 类型 #0x12 无效”

我知道我可能在这里遗漏了一些非常明显的东西(或者我是吗?),如果你们中的任何人能指出我正确的方向,我将不胜感激。

谢谢

【问题讨论】:

  • 你做到了吗?
  • 3.5年后有什么解决办法吗?

标签: android android-widget android-layout


【解决方案1】:

您需要从 XML 文件的资源标识符开始,最好在 res/xml 中。然后你可以通过先创建一个 XmlPullParser 来获取一个 AttributeSet:

Resources res = context.getResources();
XmlPullParser parser = res.getXml(R.xml.some_xml_file);

// Seek to the first tag.
int type = 0;
while (type != XmlPullParser.END_DOCUMENT && type != XmlPullParser.START_TAG) {
    type = parser.next();
}

// Wrap as an attribute set.
AttributeSet attrs = Xml.asAttributeSet(parser);

您可以在 AOSP 的可绘制 CTS 测试中找到这方面的示例。

【讨论】:

【解决方案2】:

您的 XML(R.style.my_stylez) 似乎不存在,或者您的 R 文件已过时。

【讨论】:

    【解决方案3】:

    每当您向 res 目录添加新内容时,最好清理和构建项目。但自从 ADT 15 以来,这并不总是很好。有时您必须更进一步,删除 bin 目录以及 gen 目录。

    在 adt 重新创建这两个目录后,再次尝试运行 clean。

    【讨论】:

      【解决方案4】:

      环顾四周似乎很清楚,这是不可能的。对不起。我真的希望这是可能的......

      【讨论】:

        【解决方案5】:

        getXml 方法将从 res/xml 中读取,而不是从 res/values 中读取,我认为这个想法是您使用其他方法之一来获取数据,例如

        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyCustomTheme);
        

        然后从 TypedArray 中获取值:

        thingColor = a.getColor(R.styleale.myCustomColor, res.getColor(R.color.myDefaultColor));
        

        这适用于样式,但是我的问题是首先从 XML 获取 AttributeSet attrs 以用作覆盖,并允许人们在运行时指定他们想要的 XML 文件,将其扩展为 AttributeSet 并传递它.

        当我有第二部分的答案时我会回复,但代码示例应该可以解决

        【讨论】:

        • 您正在寻找 Xml.asAttributeSet(context.getResources().getXml(R.xml.my_xml_file))。查看 AOSP 中的一些可绘制 CTS 测试以获取示例。
        猜你喜欢
        • 1970-01-01
        • 2015-05-15
        • 2018-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-05
        • 1970-01-01
        相关资源
        最近更新 更多