1、setContentView的作用是将View加载到根view之上,这样当显示view时,先显示根view,然后在显示子view,以此类推,最终将所有view显示出来。
2、setContentView必须要放在findviewbyid之前,因为view在加载之前是无法引用的。
3、setContentView最本质的作用是为要显示的view分配内存。
4、activity、window和view之间的关系:
而当我们运行程序的时候,有一个setContentView()方法,Activity其实不是显示视图(直观上感觉是它),实际上Activity调用了PhoneWindow的setContentView()方法,然后加载视图,将视图放到这个Window上,而Activity其实构造的时候初始化的是Window(PhoneWindow),Activity其实是个控制单元,即可视的人机交互界面。
打个比喻:
Activity是一个工人,它来控制Window;Window是一面显示屏,用来显示信息;View就是要显示在显示屏上的信息,这些View都是层层重叠在一起(通过infalte()和addView())放到Window显示屏上的。而LayoutInfalter就是用来生成View的一个工具,XML布局文件就是用来生成View的原料
activity调用setContentView其实是调用window的方法
在activity中:
public void setContentView(int layoutResID) {
getWindow().setContentView(layoutResID);
initActionBar();
}
在PhoneWindow类中:
@Override
public void setContentView(int layoutResID) {
if (mContentParent == null) {
installDecor();
} else {
mContentParent.removeAllViews();
}
mLayoutInflater.inflate(layoutResID, mContentParent);
final Callback cb = getCallback();
if (cb != null && !isDestroyed()) {
cb.onContentChanged();
}
}
从上面代码可以看出,最终的根View就是mContentParent,而mContentParent就是installDecor()生成的DecorView。
5、如何在一个activity中显示不同布局?
1)使用LayoutInflater inflate两个view:v1,v2
2)使用setContentView(View view)方法设置这两个view
具体讲解在http://blog.csdn.net/yanzi1225627/article/details/7802402