View相关问题解惑(ViewRootImpl,PhoneWindow创建时机,View.post为何可以获取View宽高)

本文深入探讨了Android中Activity.setContentView()的执行过程,解释了为何在onCreate()中使用View.post()能获取View宽高。通过分析PhoneWindow的初始化、View的渲染时机以及ViewRootImpl的角色,揭示了Android视图系统的工作原理。
摘要由CSDN通过智能技术生成

毕业一年了,都没有找到时间对Android技术进行整理,疲于项目工作,发现对一些基础性的疑惑没有进行追根溯源。若想在技术方面有所提升,对源码的解读是必须要迈过去的坎。以后要继续坚持写博客了。

1. Activity.setContentView()到底做了什么?执行了此方法,就开始渲染视图(执行ViewRootImpl.performTransversal)了吗?

首先回答:setContentView只是建立了View树,并没有进行渲染工作(其实真正的渲染工作是在onResume之后,后面我会从源码角度讲到)。也正是建立了View树,因此我们可以通过findViewById()来获取到View对象,但是由于并没有进行渲染视图的工作(没有执行ViewRootImpl.performTransversal),其实没有进行渲染工作的直接感受是,在onResume()方法里直接获取View.getHeight()/View.getWidth()得到的结果总是0,这是因为View还没有执行onMeasure()。

下面细细琢磨一下setContentView的流程:

setContentView->都是调用的PhoneWindow.setContentView()(注:PhoneWindow是Window的唯一实现类)。

那么这里的PhoneWindow对象(Activity.mWindow)是在何时进行初始化的呢?显然是在onCreate()的方法之前,不然就空指针了,那具体是什么时候呢

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值