首页 > 学院 > 开发设计 > 正文

activity,window,view

2019-11-08 00:24:54
字体:
来源:转载
供稿:网友

setContentView整个过程主要是如何把Activity的布局文件或者java的View添加至窗口里,重点概括为:

创建一个DecorView的对象mDecor,该mDecor对象将作为整个应用窗口的根视图。

依据Feature等style theme创建不同的窗口修饰布局文件,并且通过findViewById获取Activity布局文件该存放的地方(窗口修饰布局文件中id为content的FrameLayout)。

将Activity的布局文件添加至id为content的FrameLayout内。

当setContentView设置显示OK以后会回调Activity的onContentChanged方法。Activity的各种View的findViewById()方法等都可以放到该方法中,系统会帮忙回调。

LayoutInflater的使用中重点关注inflate方法的参数含义:

inflate(xmlId, null); 只创建temp的View,然后直接返回temp。

inflate(xmlId, parent); 创建temp的View,然后执行root.addView(temp, params);最后返回root。

inflate(xmlId, parent, false); 创建temp的View,然后执行temp.setLayoutParams(params);然后再返回temp。

inflate(xmlId, parent, true); 创建temp的View,然后执行root.addView(temp, params);最后返回root。

inflate(xmlId, null, false); 只创建temp的View,然后直接返回temp。

inflate(xmlId, null, true); 只创建temp的View,然后直接返回temp。

1,如何理解Activity,View,Window三者之间的关系?

这个问题真的很不好回答。所以这里先来个算是比较恰当的比喻来形容下它们的关系吧。Activity像一个工匠(控制单元),Window像窗户(承载模型),View像窗花(显示视图)LayoutInflater像剪刀,Xml配置像窗花图纸。

1:Activity构造的时候会初始化一个Window,准确的说是PhoneWindow。

2:这个PhoneWindow有一个“ViewRoot”,这个“ViewRoot”是一个View或者说ViewGroup,是最初始的根视图。

3:“ViewRoot”通过addView方法来一个个的添加View。比如TextView,Button等

4:这些View的事件监听,是由WindowManagerService来接受消息,并且回调Activity函数。比如onClickListener,onKeyDown等。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表