}
}
[](
)_3_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.indexOfChild(this);
// 把 ViewStub 从 parent 中移除
parent.removeViewInLayout(this);
// 接下来就是把 view 加到 parent 的 index 位置中
final ViewGroup.LayoutParams layoutParams = getLayoutParams();
if (layoutParams != null) {
// 如果 ViewStub 的 layoutParams 不为空
// 就设置给 view
parent.addView(view, index, layoutParams);
} else {
parent.addView(view, index);
}
// mInflatedViewRef 就是在这里对 view 进行了弱引用
mInflatedViewRef = new WeakReference<View>(view);
if (mInflateListener != null) {
// 回调
mInflateListener.onInflate(this, view);
}