【Android API】setContentView流程分析

本文深入解析了Android中setContentView方法的工作原理,从XML文件解析到View对象创建,再到视图的测量、布局与绘制过程,详细阐述了Activity页面内容加载的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【难度系数★★☆☆☆】我们为Activity设置页面内容,都是在onCreate()中调用setContentView(R.layout.layout_id)来实现的,那么setContentView是如何将一个layout.xml显示到手机屏幕上的呢?

  在看这篇文章之前,可以先看我的这篇文章:startActivity流程分析 里面讲到了一个新启动的Activity的onCreate方法是如何被调用到的。
  那么不废话直接放setContentView的流程图
setContentView的流程图

看不清原图可以在这里看http://www.liyafeng.com/setContentView.html

通过上面的流程,我们可以知道:

  • 一个xml是通过XmlParser来解析的,获取到的标签是通过反射的形式来创建一个View对象
  • 一个PhoneWindow持有一个DecorView对象,这个DecorView继承自FrameLayout,而且是在setContentView的时候被创建
  • 这个时候会在DecorView内部添加一个子布局,叫screen_simple.xml,这个布局就是title+content,这个content是一个FrameLayout,我们自己添加的视图就是添加到这里的
  • 所有xml都被解析添加后,系统调用ViewRootImpl的doTraversal()方法来遍历View视图来进行measure、layout、draw
  • 其实measure是测量view的宽高,如果是match_parent或者指定宽高,那么这个值就会被记录下来,如果是warp_content就会根据子view的测量来定。
  • layout也会根据margin、padding这些参数,配合特定布局重写的onLayout方法来确定View的left、top、right、bottom这些参数
  • 最后绘制,其实是从最顶层的DecorView的draw(canvas)开始,这个Canvas就一层层往下传,View就根据测量和布局的到的参数在画布的指定位置进行绘制,所以我们自定义控件就是重写onMeasure,onDraw,然后处理滑动事件,就能完成大部分常用的业务需求
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值