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
  1. ClipDrawableActivity onCreate() time=1376920332125
  2. ClipDrawableActivity onResume() TestImageView.width=0 time=1376920332149
  3. MainActivity onWindowFocusChanged hasFocus=false
  4. ClipDrawableActivity TestImageView onMeasure()
  5. ClipDrawableActivity TestImageView onMeasure()
  6. ClipDrawableActivity TestImageView onMeasure()
  7. ClipDrawableActivity TestImageView onMeasure()
  8. ClipDrawableActivity TestImageView onLayout()
  9. ClipDrawableActivity onGlobalLayout() TestImageView.width=736 time=1376920332185
  10. ClipDrawableActivity onWindowFocusChanged() hasFocus=true TestImageView.width=736 time=1376920332187
  11. ClipDrawableActivity TestImageView onMeasure()
  12. ClipDrawableActivity TestImageView onMeasure()
  13. ClipDrawableActivity TestImageView onLayout()
  14. ClipDrawableActivity onGlobalLayout() TestImageView.width=736 time=1376920332194
  15. ClipDrawableActivity TestImageView onDraw()

其调用顺序为Activity.oncreate()→Activity.onResume()→
→TestImageView.onMeasure()→TestImageView.onLayout()→onGlobalLayoutListener()→
→Activity.onWidnowFocusChanged()→.....→
→TextImageView.onDraw()

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

转载于:https://www.cnblogs.com/roccheung/p/5797458.html

Android中的onWindowFocusChanged()方法详解相关推荐

  1. android中oncreate方法,android开发之onCreate( )方法详解

    这里我们只关注一句话:This is where you should do all of your normal static set up.其中我们只关注normal static, normal ...

  2. Android中的四大组件详解

    Android中的四大组件详解 我们都知道Android系统应用层框架中,为开发者提供了四大组件来便于应用的开发,它们是Activity.Service.BroadcastReceiver.Conte ...

  3. android开发之onCreate( )方法详解

    android开发之onCreate( )方法详解 onCreate( )方法是android应用程序中最常见的方法之一,那么,我们在使用onCreate()方法的时候应该注意哪些问题呢? 先看看Go ...

  4. java多线程中的join方法详解

    java多线程中的join方法详解 方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答. 自从接触Java多线程,一直对Join理解不了.JDK是这样说的:join p ...

  5. Java中的main()方法详解

    源文作者:leizhimin    源文链接:http://lavasoft.blog.51cto.com/62575/53263 源文作者版权申明: 版权声明:原创作品,允许转载,转载时请务必以超链 ...

  6. Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)

    Python 在子类中调用父类方法详解(单继承.多层继承.多重继承)   by:授客 QQ:1033553122   测试环境: win7 64位 Python版本:Python 3.3.5 代码实践 ...

  7. php 文件扫描去重,PHP中的去重方法详解和文件下载

    本文主要和大家分享PHP中的去重方法详解和文件下载,在php中文件导入过程中,经常会遇到重复事件,那么就需要我们去重,然后进行下载. 1.思想 先设置一个存储主键数组,和一个空数组.解析文件,然后看要 ...

  8. keep alive PHP,vue中keep-alive使用方法详解

    这次给大家带来vue中keep-alive使用方法详解,vue中keep-alive使用的注意事项有哪些,下面就是实战案例,一起来看一下. 1.keep-alive的作用以及好处 在做电商有关的项目中 ...

  9. android studio parcelable,Android中Parcelable的使用详解

    Parcelable与Serializable Serializable是Java为我们提供的一个标准化的序列化接口. Parcelable是Android为我们提供的序列化的接口. 对比: 1.Pa ...

  10. java中main是什么_Java中的main()方法详解

    在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是 ...

最新文章

  1. linux命令之创建符号连接-ln
  2. 验证网站地址是否有效
  3. m40型工业机器人_工业机器人在汽车生产中有的应用范围
  4. euv光刻机有什么用_日本光学技术全球第一,可高端光刻机为何只有荷兰能造?...
  5. HTML <!DOCTYPE> 标签
  6. 鼻塞用鼻喷剂-调研(成分+刺激性)
  7. org.apache.tomcat.util.scan.StandardJarScanner找不到serializer.jar的问题
  8. 基于verilog流水灯设计
  9. GPS/BDS:LAC区域码和CELLID移动基站ID
  10. asp.net---jquery--ajax 实现滚动条滚动到底部分页显示
  11. python脚本转换为EXE文件
  12. 用cmd下载python库先安装_python 安装库几种方法之cmd,anaconda,pycharm详解
  13. 邯郸php,邯郸php程序员培训,邯郸php程序员培训费用,邯郸php程序员培训完工作好找吗...
  14. 数据分析项目实战——链家深圳二手房房源数据分析
  15. 得物购买截图生成_iPhone12订单生成器网页版-iPhone12订单生成器网页版链接分享预约 v1.0...
  16. 浪潮服务器不显示光驱,电脑不从光驱启动怎么办?我是浪潮品牌的机子。
  17. python flask 微信_使用Flask创建微信公众号
  18. textarea研究
  19. [原创插件] [服务端插件] [新手开发者必看]优秀插件开发教程列表 欢迎回复讨论
  20. 【算法导论】生日悖论

热门文章

  1. 配置中心Nacos与Apollo比较
  2. 51单片机原理知识点,复位时钟和时序(二)
  3. radiogroup多选_【RadioGroup】实现单选并获得所选项值 | 学步园
  4. 2021年广东开放大学期末考试方法,怎么查题,找答案
  5. 【渝粤教育】国家开放大学2018年秋季 0556-22T广告摄影 参考试题
  6. 分享两个私藏的获取电子书资源方法
  7. 【大规模深度强化学习(一) 】深度强化学习中的异步方法(A3C)
  8. 基于OpenCV的红绿灯识别代码解析
  9. 236.Lowest Common Ancestor of a BinaryTree
  10. 9个JQuery和5个JavaScript经典面试题