onWindowFocusChanged和measureAllChildren

来源:互联网 发布:在线签名设计软件 编辑:程序博客网 时间:2024/06/09 00:14
Activity生命周期中,onStart, onResume, onCreate都不是真正visible的时间点,真正的visible时间点是onWindowFocusChanged()函数被执行时。

译注:从onWindowFocusChanged被执行起,用户可以与应用进行交互了,而这之前,对用户的操作需要做一点限制。

有的时候我们想要获取控件的一些高度和宽度等信息,我们在onCreate和onStart等函数中去获取控件的高度(宽度),分别调用getHeight和getWidth,可是发现获取到的都是0,这是为什么呢,因为在onStart和onCreate这些函数中,还没有真正的绘制完界面,连界面都还没有,怎么会有这些控件呢,更别提宽度高度这些属性了。

那么问题来了,什么时候我们可以去获取这些数据?那当然是在界面都绘制完毕了,去获取了?

那么问题又来了,什么时候是绘制完毕呢?那就是当onWindowFocusChanged函数被执行的时候就可以了,这个函数该界面已经获的focus了,也说明可以获取控件的相关信息了。当然,看这个函数的名字就知道,当然这个window失去焦点的时候,也会被执行,所以这个时候可以通过hasFocus这个属性来判断啦。


相关执行打印:
1: entry: onStart---->onResume---->onAttachedToWindow----------->onWindowVisibilityChanged--visibility=0---------->onWindowFocusChanged(true)------->

2. exit:  onPause---->onStop---->onWindowFocusChanged(false)  ---------------------- (lockscreen)

3. exit : onPause----->onWindowFocusChanged(false)-------->onWindowVisibilityChanged--visibility=8------------>onStop(to another activity)


那measureAllChildren是什么呢?这是一个layout的属性。在framelayout等中可以使用。当framelayout中有一个控件其visibility为gone的时候(如果你不知道visibility为gone是什么样的效果的话,建议你先去百度),即使在onWindowFocusChanged中,也是获取不到该控件的高度和宽度的,获取到的还是0.那么这个时候measureAllChildren就派上用场了,在framelayout中设置android:measureAllChildren为true,就是说在该layout下的所有view都可以被计算大小,现在你又可以得到控件的高度宽度属性了。

我记得当时实习的时候,有个需求是要获取到一块显示视频的view的大小,当时是在onCreate函数中去获取的,可是发现死活也取不到,都是0,我前面实习哪位老兄竟然在onCreate里面搞了个线程还是什么的去循环读getHeight,直到读到的值不为0,现在想想也真是醉了。

0 0
原创粉丝点击