Android源码分析——View是如何被添加到屏幕的?
短信预约 -IT技能 免费直播动态提醒
我们看到
R.id.content
确实是存在的,并且它是一个FrameLayout
。到这里我们来看下现在前面这些具体做了哪些?如下图所示,到这里 Activity 持有一个 PhoneWindow 对象,PhoneWindow 中有一个 DecorView ,DecorView 中加载了一个基础的资源布局,里面有 title,ActionBar 等,肯定存在一个 id 为
R.id.ccontent
的资源布局。看到这里就完了?不不不,还有我们继续往下看!!!
2.2 mLayoutInflater.inflate(layoutResID, mContentParent)我们继续回到
PhoneWiondow
的setContentView(int layoutResID)
,如下:
@Override
public void setContentView(int layoutResID) {
// Note: FEATURE_CONTENT_TRANSITIONS may be set in the process of installing the window
// decor, when theme attributes and the like are crystalized. Do not check the feature
// before this happens.
if (mContentParent == null) {
installDecor();
} else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
mContentParent.removeAllViews();
}
if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
final Scene newScene = Scene.getSceneForLayout(mContentParent, layoutResID,
getContext());
transitionTo(newScene);
} else {
mLayoutInflater.inflate(layoutResID, mContentParent);
}
mContentParent.requestApplyInsets();
final Callback cb = getCallback();
if (cb != null && !isDestroyed()) {
cb.onContentChanged();
}
mContentParentExplicitlySet = true;
}
我们前面看完了
installDecor()
方法,我们继续往下看,我们看到下面紧接着调用了mLayoutInflater.inflate(layoutResID, mContentParent);
将之前 Activity 中从传入的资源布局加载到我们前面初始化的mContentParent
中,也就是在资源ID为R.id.ccontent
的 Framlayout 中。现在我们来看看我们传进来的资源布局文件被加载到哪里了?总结
这篇文章我们从 Ativity 的 setContentView(layoutResourceId) 开始,一步步追踪 Android FrameWork 层的源码。探究了我们平时代码中写的资源布局是如何被加载到 Activity 中的。我们根据源码简单画了一个流程图如下:
欢迎在评论区留下你的观点大家一起交流,一起成长。如果今天的这篇文章对你在工作和生活有所帮助,欢迎转发分享给更多人。
同时欢迎大家加入我组建的大前端学习交流群,群里大家一起学习交流 Android、Flutter等知识。从这里出发我们一起讨论,一起交流,一起提升。
群号:872749114
作者:紫雾凌寒
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341