} else {
// 如果为 null,就抛出异常
throw new IllegalStateException(“setVisibility called on un-referenced view”);
}
} else {
super.setVisibility(visibility);
// 之前说过,setVisibility(int) 也可以进行加载布局
if (visibility == VISIBLE || visibility == INVISIBLE) {
// 因为在这里调用了 inflate()
inflate();
}
}
}
核心来了,平时用的时候,会经常调用到该方法。inflate() 是关键的加载实现,代码如下所示:
public View inflate() {
// 获取父视图
final ViewParent viewParent = getParent();
if (viewParent != null && viewParent instanceof ViewGroup) {
// 如果没有指定布局,就会抛出异常
if (mLayoutResource != 0) {
// viewParent 需为 ViewGroup
final ViewGroup parent = (ViewGroup) viewParent;
final LayoutInflater factory;
if (mInflater != null) {
factory = mInflater;
} else {
// 如果没有指定 LayoutInflater
factory = LayoutInflater.from(mContext);
}
// 获取布局
final View view = factory.inflate(mLayoutResource, parent,
false);
// 为 view 设置 Id
if (mInflatedId != NO_ID) {
view.setId(mInflatedId);
}
// 计算出 ViewStub 在 parent 中的位置
final int index = parent.indexOfC