在Activity中,调用setContentView()方法,即可将自定义的View或者布局资源xml文件,添加至界面,那么setContentView()方法具体执行了哪些操作,view又是如何添加上去的呢。
进入Activity的setContentView()方法,发现其调用了getWindow().setContentView()方法,getWindow()返回的是Window对象,而该Window对象的唯一实现类是PhoneWindow。
//Activity
public void setContentView(@LayoutRes int layoutResID) {
getWindow().setContentView(layoutResID);
initWindowDecorActionBar();
}
进入PhoneWindow类,找到setContentView()方法,该方法中主要做了以下事情:
1)初始化顶层DecorView
2)创建父容器mContentParent,并添加至DecorView
3)解析传递的布局资源id,并将解析的view添加到contentParent中,从而完成view的添加。
@Override
public void setContentView(int layoutResID) {
if (mContentParent == null) {
//注释1 此方法中初始化DecorView,创建父容器mContentParent
installDecor();
} else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
mContentParent.removeAllViews();
}
if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
final Scene newScene = Scene.getSceneForLayout(mContentParent, layoutResID,
getContext());
transitionTo(newScene);
} else {
//注释4 这里解析layoutResID,并添加至mContentParent
mLayoutInflater.inflate(layoutResID, mContentParent);
}
mContentParent.requestApplyInsets