setContentView剖析
2016-04-18 10:55
274 查看
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
顶
16
踩
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
顶
16
踩
相关文章推荐
- Android 从setContentView谈Activity界面的加载过程
- Android UI源码解析
- 关于android初学的小知识强化
- 从setContentView()谈起
- Activity绑定界面 两种方法
- Intent知识小学习
- Android - Activity(活动) 详解
- findViewById()与Inflate()和setContentView()关系扯谈
- activity 中的 setContentView( )方法
- SetContentView 到底Set去哪里呢?
- android用setcontentview来加载一个布局文件的本质原因
- Android应用程序资源的查找过程分析
- Window和DecorView
- Android中不得不谈的setContentView
- 捋一捋 Activity 的启动流程 以及 界面的初始化过程
- Android应用程序窗口View的创建过程
- Android中view的加载机制(一)
- setContentView、findViewById 和 inflate 的区别?
- requestWindowFeature()为什莫要放在setContentView(0前面
- 从setContentView谈谈android的布局层级