【问题标题】:Parsing android resources from xml从xml解析android资源
【发布时间】:2015-06-13 19:48:53
【问题描述】:

我在为我的 Android 应用程序解析 XML 文件时遇到了一些问题。

我需要 XML 文件中的一些布局 ID 和颜色 ID。我在读取字符串值时没有问题,但我不知道如何将 XML 布局引用转换为布局 ID?谢谢你的帮助!!

我的 XML 文件如下所示:

<program
    name="ProgramName"
    color="@color/white"
    prefLayoutId="@layout/pref" />

我的解析代码就是这样工作的。颜色/布局的解析不起作用:

XmlPullParser xmlParser = getResources().getXml(R.xml.programlist);

int event = xmlParser.getEventType();
while (event != XmlPullParser.END_DOCUMENT) {
    String name = xmlParser.getName();

    switch (event) {
        case XmlPullParser.START_TAG: {
            break;
        }
        case XmlPullParser.END_TAG: {
            if(name.equals("program")) {
                ProgramInfo pi = new ProgramInfo();

                pi.name = xmlParser.getAttributeValue(null, "name");

                // HERE I need something like COLOR.Black;
                pi.color = Integer.valueOf(xmlParser.getAttributeValue(null, "color"));

                // HERE I need something like R.layout.pref
                pi.pref = Integer.valueOf(xmlParser.getAttributeValue(null, "prefLayoutId"));

                result.add(pi);
         }
         break;
     }
}

event = xmlParser.next();

【问题讨论】:

    标签: java android xml parsing xml-parsing


    【解决方案1】:

    试试这个:

    Resources resources = getResources();
    XmlResourceParser xmlParser = resources.getXml(R.xml.programlist);
    
    ...
    
    int resourceId = xmlParser.getAttributeResourceValue(null, "color", 0);
    pi.color = (resorceId == 0) ? SOME_DEFAULT_COLOR : resources.getColor(resourceId);
    pi.pref = xmlParser.getAttributeResourceValue(null, "prefLayoutId", 0);
    

    getAttributeResourceValue 将返回一个引用的资源 id,存储在相应的值中。

    【讨论】:

    • 感谢您的回答。它说“无法解析 getAttributeResourceValue(..)”。怎么了?
    • 将 xmlParser 变量类型从 XmlPullParser 替换为 XmlResourceParser
    • 那么,问题是我无法获取 AttributeValue“名称”。使用 AttributeSet Xml.asAttributeSet(xmlParser) 更好吗?但是这两种方式,你的代码和 AttributeSet.getAttributeResourceValue 的使用都没有像 R.layout.pref 一样的行为。但区别在哪里。
    • XmlResourceParser 是 XmlPullParser 的超级接口。因此,您也可以使用 getAttributeValue,无论哪种方式。XmlResourceParser 也实现了 AttributeSet,因此您不需要以其他方式对其进行转换。 getAttributeResourceValue 的结果是资源的 id,如果未找到资源,则为零(第三个参数)。所以,如果找到了,应该和直接访问R.layout.pref一样
    • 我刚刚注意到的一个可能问题:您在 XmlPullParser.END_TAG 中解析值,但应该在 XmlPullParser.START_TAG 中完成。尝试将您的代码移到那里
    猜你喜欢
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 2016-12-07
    相关资源
    最近更新 更多