三个核心类: Activity:调用setContentView Window:产生视图的抽象类【实际生效类:PhoneWindow】 View:视图的抽象类【实际生效类:DecorView】 流程: Activity调用setContentView,实际调用到PhoneWindow的对应方法; PhoneWindow做了三件事: 1、生成一个DecorView; 2、生成一个ViewGroup包装DecorView; 3、通过LayoutInflater.inflate把layout_id的xml和ViewGroup关联起来。 一句话总结: 流程就是PhoneWindow通过LayoutInflater.inflate把layout_id和ViewGroup关联起来。
源码涉及的类: com.android.internal.policy.PhoneWindow 其中重点方法installDecor(): 1、生成一个DecorView; 2、生成一个ViewGroup包装DecorView; 3、根据主题等预定义标签初始化View; 4、inflate关联xml布局和view。 com.android.internal.policy.DecorView android.view.Window
补充:setContentView()时,通过inflate,实际上是把id叫作content的FrameLayout作为root布局传入了,所以方法名叫作setContentView(),而不是叫setView()。 可以看一下PhoneWindow的generateLayout方法中返回的ViewGroup其实就是把ID为com.android.internal.R.id.content, 这样才能让inflate传入的xml的layout参数就能生效。(没有rootView的情况下,xml的最外层的layout参数不起作用)
|