Android xml资源分析器无法识别id属性

Android xml资源分析器无法识别id属性,android,xml-parsing,Android,Xml Parsing,我正试图拉出活动中所有已分配id的文本视图,以便用动态值填充它们。为此,我使用XMLResourceParser遍历标记并获取id。代码如下: public int[] getElementIds(int layoutId, String viewType) throws XmlPullParserException, IOException{ XmlResourceParser parser = activity.getResources().getLayout(layoutId

我正试图拉出活动中所有已分配id的文本视图,以便用动态值填充它们。为此,我使用
XMLResourceParser
遍历标记并获取id。代码如下:

public int[] getElementIds(int layoutId, String viewType) 
  throws XmlPullParserException, IOException{
    XmlResourceParser parser = activity.getResources().getLayout(layoutId);
    LinkedList<Integer> idList = new LinkedList<Integer>();
    while(parser.getEventType()!=XmlResourceParser.END_DOCUMENT){
        parser.next();
        if(parser.getEventType()==XmlResourceParser.START_TAG){
            if(parser.getName().equals(viewType)){
            idList.add(parser.getIdAttributeResourceValue(0)); //here's the problem
            }
        }
    }
    // returns an int[] from values collected
}

有什么想法吗?

经过进一步研究,我似乎在API中发现了一个bug。在线可用的代码如下所示:

public int getIdAttributeResourceValue(int defaultValue) {
      return getAttributeResourceValue(null, "id", defaultValue);
}

public int getAttributeResourceValue(String namespace, String attribute, int defaultValue) {
       int idx = nativeGetAttributeIndex(mParseState, namespace, attribute);
       if (idx >= 0) {
           return getAttributeResourceValue(idx, defaultValue);
       }
   return defaultValue;
}

 public int getAttributeResourceValue(int idx, int defaultValue) {
       int t = nativeGetAttributeDataType(mParseState, idx);
       // Note: don't attempt to convert any other types, because
       // we want to count on appt doing the conversion for us.
       if (t == TypedValue.TYPE_REFERENCE) {
            return nativeGetAttributeData(mParseState, idx);
       }
       return defaultValue;
 }

其中最后一个函数是实际执行工作的函数。这个类(XMLBlock)没有文档,我也无法访问
本机
函数,这些函数实际上是用C编写的。我所知道的是,这里有问题的函数是第二个函数,名称空间和属性名称是参数。对于属性名“style”,它可以正常工作,但对于“id”(它既是API在另一个位置提供的名称,也是由返回属性名的不同函数返回的值,提供了给定的索引),它没有任何结果,并且始终会吐出默认值。此外,我可以通过使用参数为属性索引而不是名称(上面复制的最后一个函数)的函数访问相同的id值。结论:“本机”代码处理名称“id”的方式有些混乱。我正在向开源项目发送一份bug报告,我将发布我得到的任何响应。

作为一种解决方法,我在自己的代码中实现了此功能:

private int getIdAttributeResourceValue(XmlResourceParser parser) {
    final int DEFAULT_RETURN_VALUE = 0;
    for (int i = 0; i < parser.getAttributeCount(); i++) {
        String attrName = parser.getAttributeName(i);
        if ("id".equalsIgnoreCase(attrName)) {
           return parser.getAttributeResourceValue(i, DEFAULT_RETURN_VALUE);
        }
    }
    return DEFAULT_RETURN_VALUE;
}
private int getIDAttributeSourceValue(XmlResourceParser){
最终整数默认返回值=0;
for(int i=0;i
您有您报告的问题编号吗?我现在甚至找不到问题报告员。但我可以告诉你我的解决办法!
private int getIdAttributeResourceValue(XmlResourceParser parser) {
    final int DEFAULT_RETURN_VALUE = 0;
    for (int i = 0; i < parser.getAttributeCount(); i++) {
        String attrName = parser.getAttributeName(i);
        if ("id".equalsIgnoreCase(attrName)) {
           return parser.getAttributeResourceValue(i, DEFAULT_RETURN_VALUE);
        }
    }
    return DEFAULT_RETURN_VALUE;
}