Activity View Window分别是什么?
Activity : Android四大组件之一,存放View组件的容器,也是我们界面的载体,可以用来展示一个界面,它有一个setContentView()方法,可以将我们定义的布局设置到界面上。
View : 这个类代表了用户界面组件的基本构件。
Window: 抽象基类,用于顶级窗口外观和行为策略。The only existing implementation of this abstract class is android.view.PhoneWindow, which you should instantiate when needing a Window.
Activity的setContentView()都做了哪些操作呢
Activity.setContentView(intresId) 该方法在Activity类中,该方法只是简单的回调Window对象,具体为PhoneWindow对象的setContentView()方法实现。
public void setContentView(@LayoutRes int layoutResID) {
getWindow().setContentView(layoutResID);
initWindowDecorActionBar();
}
public Window getWindow() {
return mWindow; //Window对象,本质上是一个PhoneWindow对象
}
PhoneWindow.setContentView()方法
ViewGroup mContentParent;
@Override
public void setContentView(int layoutResID) {
...
//是否是第一次调用setContentView方法, 如果是第一次调用,则mDecor和mContentParent对象都为空
if (mContentParent == null) {
installDecor();
} else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
//如果没有设置过feature,移除其内部所有的子Views
mContentParent.removeAllViews();
}
...
}
mContentParent是个ViewGroup包含我们整个布局文件,installDecor就是去初始化mContentParent和创建DecorView
private void installDecor() {
if (mDecor == null) { //如果decorView为空,就生成一个
mDecor = generateDecor(-1);
...
} else { //否则将phoneWindow设置到decorView上
mDecor.setWindow(this);
}
if (mContentParent == null) {
//根据当前的主题设置根ViewGoup
mContentParent = generateLayout(mDecor);
...
} else {
...
}
}
DecorView
DecorView(Context context, int featureId, PhoneWindow window,
WindowManager.LayoutParams params) {
super(context);
mFeatureId = featureId;
...
//把Android系统中的非标准度量尺寸转变为标准度量尺寸
updateAvailableWidth();
setWindow(window);
...
}
至此,Activity、View、Window就联系在一起了。即通过setContentView()方法,创建DecorView,并将Window设置上,再利用该DecorView生成一个ViewGroup。
可见,DecorView是核心。
网友评论