1.2. Activity、Window、DecorView之间关系
首先来看一下Activity中setContentView源码:
public void setContentView(@LayoutRes int layoutResID) {
//将xml布局传递到Window当中
getWindow().setContentView(layoutResID);
initWindowDecorActionBar();
}
从代码可以看出,Activity
的setContentView
实质是将View
传递到Window
的setContentView()
方法中,Window
的setContenView
会在内部调用installDecor()
方法创建DecorView
,看一下它的部分源码:
public void setContentView(int layoutResID) {
if (mContentParent == null) {
//初始化DecorView以及其内部的content
installDecor();
} else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
mContentParent.removeAllViews();
}
if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
…
} else {
//将contentView加载到DecorVoew当中
mLayoutInflater.inflate(layoutResID, mContentParent);
}
…
}
private void installDecor() {
…
if (mDecor == null) {
//实例化DecorView
mDecor = generateDecor(-1);
…
}
} else {
mDecor.setWindow(this);
}
if (mContentParent == null) {
//获取Content
mContentParent = generateLayout(mDecor);
}
…
}
protected DecorView generateDecor(int featureId) {
…
return new DecorView(context, featureId, this, getAttributes());
}
通过generateDecor()
new一个DecorView
,然后调用generateLayout()
获取DecorView
中content
,最终通过inflate
将Activity
视图添加到DecorView
中的content
中,但此时