Android中的onWindowFocusChanged()方法详解
2013-11-26 18:15
501 查看
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()的调用顺序,如下:
[html] view
plaincopy
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上。
onWindowFocusChanged():当Activity的当前Window获得或失去焦点时会被回调此方法。当回调了这个方法时表示Activity是完全对用户可见的(只是可见,还一片黑呼呼的,有待draw..)。当对话框弹起/消失及Activity新创建及回退等都会调用此方法。
相比之下,onResume()方法更多的是指Activity进入了可见的状态,但只是状态,并不是真正的界面构建完成了。
眼见为实,动手实践。
写了个简单的demo,一个Activity只显示一个TestImageView,并重写TestImageView下的onMeasure()、onLayout()、onDraw()方法,并对其设置onGlobalLayout()监听,观察这几个方法与Activity的onResume()、onWindowFocusChanged()的调用顺序,如下:
[html] view
plaincopy
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上。
相关文章推荐
- Android中的onWindowFocusChanged()方法详解
- Android中的onWindowFocusChanged()方法详解
- 『ANDROID』Android中的onWindowFocusChanged()方法详解
- Android中的onWindowFocusChanged()方法详解
- Android 之SnackBar ,PowerManager,onWindowFocusChanged该方法的重要性
- Android onWindowFocusChanged函数详解
- Android fragment onHiddenChanged方法详解
- onWindowFocusChanged重要作用 及Activity生命周期的详解(对解决某些窗体溢出问题很有帮助)
- Android -- onWindowFocusChanged
- Android之onWindowFocusChanged
- 在onWindowFocusChanged方法中获取手机屏幕的高宽
- android界面绘制完成的标志,涉及到重写方法Activity的onWindowFocusChange
- 在onWindowFocusChanged方法中获取手机屏幕的高宽
- [Android] 直接获取组件的宽高:Activity.onWindowFocusChanged()
- android四大组件之Activity - (1)从源码中理解并巧用onWindowFocusChanged(boolean hasFocus)
- 【Android开发】onWindowfocuschanged的应用
- Android 生命周期 和 onWindowFocusChanged
- [Android] 直接获取组件的宽高:Activity.onWindowFocusChanged()
- Android onMeasure,onFocusChanged方法介绍
- [ANDROID]APP加载界面完毕时回调,onWindowFocusChanged的使用