Activity显示界面——说说View的那些理不清的关系,android开发计算器界面

本文详细解析了Android中Activity如何显示界面,重点介绍了PhoneWindow、DecorView和ViewRootImpl的角色和创建过程。从Activity的setContentView方法开始,探讨了布局加载、DecorView的生成以及ViewRootImpl的职责,最后讲解了View的绘制流程和线程更新UI的注意事项。
摘要由CSDN通过智能技术生成

之前说了,View相关的管理工作就交给窗管家,所以就直接调用到PhoneWindow的setContentView方法:

//Activity.java

public void setContentView(@LayoutRes int layoutResID) {

getWindow().setContentView(layoutResID);

initWindowDecorActionBar();

}

然后就开始加载布局文件的工作了。

但是考虑到一点,Activity是有不同的主题的,不同主题就有不同的布局结构。所以得在加载我们自己设置的布局文件之前,设置一个最顶级的View,作为所有View的老大。

而这个顶层的View就是DecorView,为了方便,我管他叫做 最顶的小弟,简称小弟。

看看小弟DecorView是怎么被创建的:

//PhoneWindow.java

@Override

public void setContentView(int layoutResID) {

if (mContentParent == null) {

installDecor();

}

if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {

mLayoutInflater.inflate(layoutResID, mContentParent);

}

}

private void installDecor() {

if (mDecor == null) {

mDecor = generateDecor(-1);

} else {

mDecor.setWindow(this);

}

if (mContentParent == null) {

mContentParent = generateLayout(mDecor);

}

}

protected DecorView generateDecor(int featureId) {

return new DecorView(context, featureId, this, getAttributes());

}

就是这样,小弟DecorView就被创建出来了,然后就该小弟工作了。

上文说过,小弟DecorView被创建出来是要干啥的?

要根据不同的主题设置不同的布局结构,这个工作就发生在generateLayout方法中了,具体咱今天就不分析了。

看似小弟的工作也完成了?

等等,应用自己的布局还没加载呢嘛,重要的事情还没开始做呢。

再回到上面的setContentView方法中,在调用installDecor方法创建了小弟之后,还做了一件事:

//加载xml布局文件

mLayoutInflater.inflate(layoutResID, mContentParent);

public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot) {

final Resources res = getContext().get

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值