Android -- onWindowFocusChanged

简介:

Android中获取手机屏幕的高度和宽度,我们知道在onCreate方法中获取到的值都是为0的,有人说可以在onClick方法中获取值,这个也是个方法 ,但在onWindowFocusChanged方法中可以直接获取到,而且有的时候场景的需要,就不得不在Activity渲染完成后立马获取值,这时候onWindowFocusChanged()方法就用到实处了,类似的有PopupWindow的显示,如果在onCreate方法中执行的话,会报没有token的异常,就是因为Activity没有渲染成功.

onWindowFocusChanged():当Activity的当前Window获得或失去焦点时会被回调此方法。当回调了这个方法时表示Activity是完全对用户可见的(只是可见,还一片黑呼呼的,有待draw..)。当对话框弹起/消失及Activity新创建及回退等都会调用此方法。

相比之下,onResume()方法更多的是指Activity进入了可见的状态,但只是状态,并不是真正的界面构建完成了。

demo                                                                                   

一个Activity只显示一个TestImageView,并重写TestImageView下的onMeasure()、onLayout()、onDraw()方法,并对其设置onGlobalLayout()监听,观察这几个方法与Activity的onResume()、onWindowFocusChanged()的调用顺序,如下:

 

复制代码
ClipDrawableActivity onCreate() time=1376920332125  
ClipDrawableActivity onResume() TestImageView.width=0 time=1376920332149  
MainActivity onWindowFocusChanged hasFocus=false  
ClipDrawableActivity TestImageView onMeasure()  
ClipDrawableActivity TestImageView onMeasure()  
ClipDrawableActivity TestImageView onMeasure()  
ClipDrawableActivity TestImageView onMeasure()  
ClipDrawableActivity TestImageView onLayout()  
ClipDrawableActivity onGlobalLayout() TestImageView.width=736 time=1376920332185  
ClipDrawableActivity onWindowFocusChanged() hasFocus=true TestImageView.width=736 time=1376920332187  
ClipDrawableActivity TestImageView onMeasure()  
ClipDrawableActivity TestImageView onMeasure()  
ClipDrawableActivity TestImageView onLayout()  
ClipDrawableActivity onGlobalLayout() TestImageView.width=736 time=1376920332194  
ClipDrawableActivity TestImageView onDraw() 
复制代码

 

Activity.oncreate()→Activity.onResume()→TestImageView.onMeasure()→TestImageView.onLayout()→onGlobalLayoutListener()→Activity.onWidnowFocusChanged()→.....→TextImageView.onDraw()

总结                                                                                   

至此,如果需要获取某个View的宽高,可以在onWindowFocusChanged()处直接获取即可,这比对某个view设置onGlobalLayoutListener的方式来获取方便了许此。又比如,对于需要读取本地文件记录来判断是否是第一次打开界面去提示文本图片的,也可以在此方法中去读取然后再显示在ui上。

我是天王盖地虎的分割线             




本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/4124966.html,如需转载请自行联系原作者

相关文章
|
7月前
|
数据建模 Java 开发工具
Android bugreport的使用
Android bugreport的使用
126 0
|
安全 Android开发 芯片
Android keymint(keymaster)一RKP
Android keymint(keymaster)一RKP
1040 0
DHL
|
Linux
为数不多的人知道的AndroidStudio快捷键(二)
为数不多的人知道的AndroidStudio快捷键(二)
DHL
128 0
为数不多的人知道的AndroidStudio快捷键(二)
DHL
|
Linux
为数不多的人知道的AndroidStudio快捷键(一)
为数不多的人知道的AndroidStudio快捷键(一)
DHL
232 0
为数不多的人知道的AndroidStudio快捷键(一)
|
Android开发
android之Fragment生命周期
android之Fragment生命周期
android之Fragment生命周期
|
Dart Android开发 Kotlin
android - FlutterActivity MethodChannel和FlutterView
android - FlutterActivity MethodChannel和FlutterView 因此,大约4个月前,我编写了Flutter应用程序。现在,我想做一个小小的更改,但是我不能再编译应用程序了,因为GeneratedPluginRegistrant.registerWith(this)不再起作用了,我没有更改Kotlin代码,只更改了Dart代码。
311 0
|
Java Android开发 数据格式
Android Robolectric使用
Rebolectic 在src中有三个包,分别是:test、androidTest 和java test:是测试不涉及Activity,UI组件的纯Java方法。
1163 0
|
Android开发
|
Java 测试技术 Android开发