先分析Activity的setContentView()
private Window mWindow;
public void setContentView(@LayoutRes int layoutResID) {
getWindow().setContentView(layoutResID);
initWindowDecorActionBar();
}
public Window getWindow() {
return mWindow;
}
Activity的setContentView()调用了Window的setContentView()方法 , 接着跟进
public abstract void setContentView(@LayoutRes int layoutResID);
The only existing implementation of this abstract class is android.view.PhoneWindow
Window是个抽象类 , 根据Window类的注释可以知道 , Window类的子类只有一个叫做PhoneWindow , 那么看一下PhoneWindow的setContentView()方法 .
ViewGroup mContentParent;
/**省略过后的代码*/
@Override
public void setContentView(int layoutResID) {
if (mContentParent == null) {
//先看下面的installDecor()方法的作用
installDecor();
} else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
mContentParent.removeAllViews();
}
//我们既然知道了mContentParent就是DecorView中的一个FrameLayout , 那么这段代码就是
//解析我们传入的layoutResID之后 , 并添加到mContentParent当中
//如果有不熟悉inflate()方法的 , 可以自己去看一下 , 他最后会调用rInflate()方法后 , 也是
//执行addView操作来添加子View
mLayoutInflater.inflate(layoutResID, mContentParent);
}
private void installDecor() {