一直都在用findViewById來初始化view,但不知道里面具體的實現(xiàn)稿蹲,先看下findViewById源碼窃爷。
public final View findViewById(@IdRes int id) {
if (id < 0) {
return null;
}
return findViewTraversal(id);
}
最后調(diào)用findViewTraversal方法痘括。
protected View findViewTraversal(@IdRes int id) {
if (id == mID) {
return this;
}
return null;
}
可以看出如果id相等就直接返回這個view,因為一般是viewgroup使用findViewById挥唠,所以viewgroup應(yīng)該重寫了這個方法抵恋。
protected View findViewTraversal(@IdRes int id) {
if (id == mID) {
return this;
}
final View[] where = mChildren;
final int len = mChildrenCount;
for (int i = 0; i < len; i++) {
View v = where[i];
if ((v.mPrivateFlags & PFLAG_IS_ROOT_NAMESPACE) == 0) {
v = v.findViewById(id);
if (v != null) {
return v;
}
}
}
return null;
}
可以看出viewGroup的id等于要找的id直接返回viewGroup子類,不等于的話就遍歷viewGoup包含的view宝磨。