ListView每个Item的ID都是一样的么,可见的Item的Vie的ID是不一样的,复用这些View的ID是一样的,类似服用View原理;
复用的其他如多个Fragment中复用了同一个Dialog?
> PULL解析器,遍历View或ViewGroup,XmlResourceParser等
1.Android平台中实现对XML的三种解析方式:DOM解析器;SAX解析器;PULL解析器
pull遍历XML- https://blog.csdn.net/qq_21983189/article/details/55096884
2.得到RootView后,遍历ViewGroup与View,得到View的ID
通过遍历View或ViewGroup得到其下面的子View。View.getId(),View.setId()
3.android之XmlResourceParser类;XmlResourceParser类是怎么样解析XML文件的。
Android 关于XmlResourceParser- https://blog.csdn.net/samlss/article/details/81332395
-- 实例如下:
import android.content.Context;
import android.content.res.XmlResourceParser;
import android.text.TextUtils;
import android.util.Xml;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class PullParserUtils {
/**
* 解析layout中Assets的View及ID
* @param context
* @param xmlName
*/
public static void xmlAssetsParser(Context context, String xmlName) {
// 得到XML解析器
List<String> viewIdList;
XmlPullParser pullParser = Xml.newPullParser();
try {
InputStream is = context.getAssets().open(xmlName);
pullParser.setInput(is, "utf-8");
viewIdList = new ArrayList<String> ();
// 得到事件类型
int eventType = pullParser.getEventType();
// 文档的末尾
// 遍历内部的内容
while (eventType != XmlPullParser.END_DOCUMENT) {
String name = pullParser.getName();
if (!TextUtils.isEmpty(name))
if (eventType == XmlPullParser.START_TAG) {
String attributeValue = pullParser.getAttributeValue(null, "id");
attributeValue = attributeValue.substring(attributeValue.indexOf("/") + 1, attributeValue.length());
viewIdList.add(attributeValue);
LogUtil.e("desaco", "PullParserUtils, viewId id = " + attributeValue);
}
eventType = pullParser.next();//读取下一个标签
}
} catch (Exception ex) {
}
}
// XmlResourceParser
/**
* 解析layout中XML的View及ID
* @param context
* @param layoutXmlId
*/
public static void xmlLayoutParser(Context context, int layoutXmlId) {
XmlResourceParser parser = null;
try {
parser = context.getResources().getLayout(layoutXmlId);
int type;
// context.getResources().getXml(2);
// context.getResources().getLayout(2);
//过滤掉END_DOCUMENT和非START_TAG的事件
while ((type = parser.next())!= XmlPullParser.END_DOCUMENT ) {
if (type != XmlPullParser.START_TAG){
continue;
}
// StringBuilder stringBuilder = new StringBuilder()
// .append("current type: ")
// .append(getType(type))
// .append("\n")
// .append("current depth: ")
// .append(parser.getDepth())
// .append("\n")
// .append("current name: ")
// .append(parser.getName())
// .append("\n");
//
// for (int i = 0; i < parser.getAttributeCount(); i++){
// stringBuilder.append(String.format("第%d个属性 -> ", i+1))
// .append(parser.getAttributeName(i))
// .append(" : ")
// .append(parser.getAttributeValue(i))
// .append("\n");
// }
//
}
}catch (IOException e){
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
} finally {
if (parser != null) {
parser.close();
}
}
}
}
public class ViewIdUtils {
/**
* 通过传入layout的顶层View后,得到子View的ID
* @param rootLayoutView
*/
public static List<Integer> getViewId(View rootLayoutView) {
List<Integer> viewIdList = new ArrayList<Integer>();
if (rootLayoutView instanceof ViewGroup) {
ViewGroup vp = (ViewGroup) rootLayoutView;
for (int i = 0; i < vp.getChildCount(); i++) {
View viewchild = vp.getChildAt(i);
viewIdList.add(viewchild.getId());
if (viewchild instanceof ViewGroup) {
//再次调用本身(递归)
viewIdList.addAll(getViewId(viewchild));
}
}
} else { // rootLayoutView instanceof View
viewIdList.add(rootLayoutView.getId());
}
return viewIdList;
}
}