版权声明:本文为博主原创文章,未经博主允许不得转载。

最近做项目时,发现在activity的onCreate()和onResume()方法里调用View.getLocationInWindow() 时,View.getLocationInWindow()返回空值,觉得很奇怪,因为以前用过,没有发现这个问题,于是调查了一下源码,这里把调查结果 做个记录。

首先,看看View.getLocationInWindow()的实现,

  1. public void getLocationInWindow(int[] location) {
  2. // When the view is not attached to a window, this method does not make sense
  3. if (mAttachInfo == null) return;
  4. ... ...
  5. }

这里有注释,说明当view没有绑定到window时,返回在window里的坐标是没有意义的。的确,窗口都没有,哪来的窗口坐标呀!!

其次,看看view何时合适绑定到窗口。通过阅读源码,发现下面这段代码:

  1. void dispatchAttachedToWindow(AttachInfo info, int visibility) {
  2. //System.out.println("Attached! " + this);
  3. mAttachInfo = info;
  4. ... ...
  5. }

看到这里,可能会想在activity.onAttachedToWindow()函数里是不是能通过调用 View.getLocationInWindow()取得view在window中的位置呢?实验一下,发现还是不能!!怪异了,接着再看,总结出如下 时序图:

从上图我们可以看出activity.onAttachedToWindow()的调用在 View.dispatchAttachedToWindow()之前,此时View还是没有绑定到window上,所以在 activity.onAttachedToWindow()里调用View.getLocationInWindow()无效。

最后,何时调用View.dispatchAttachedToWindow()才能得到有效值呢?其实上面已经有答案了,那就是从此以后都可以了,例如activity.onWindowFocusChanged()函数。

备注:

// 获取在当前窗口内的绝对坐标
View.getLocationInWindow()

// 获取在整个屏幕内的绝对坐标,注意这个值是要从屏幕顶端算起,也就是包括了通知栏的高度。
View.getLocationOnScreen()

// 下面一组是获取相对在它父窗口里的坐标。
View.getLeft() , View.getTop(), View.getBottom(), View.getRight()

View.getLocationInWindow()和 View.getLocationOnScreen()在window占据全部
screen时,返回值相同,不同的典型情况是在Dialog中时。当Dialog出现在屏幕中间
时,View.getLocationOnScreen()取得的值要比View.getLocationInWindow()取得的值要大。

最新文章

  1. 一起学 Java(三) 集合框架、数据结构、泛型
  2. neo4j初次使用学习简单操作-cypher语言使用
  3. 在 ML2 中配置 Vlan Network- 每天5分钟玩转 OpenStack(93)
  4. lua 高级
  5. win7 64位系统HP LaserJet P1008 / HP LaserJet P1008 P1007 驱动安装成功,但无法打印的原因
  6. Linux用户应知应会的7个‘ls’命令的独特技巧
  7. android学习笔记32——资源
  8. OnClientClick="return confirm('确定要删除吗?')"
  9. unity3d游戏开发 —— 倒计时
  10. FirstOrDefault()的重载方法
  11. 某安寿险HR核人面试问题总结,技术面波澜不惊,HR面反而有被暴击感
  12. python自动生成excel报表
  13. Hadoop 新生报道(四) WordCount
  14. Linux指令--cd,pwd
  15. Mysql笔试题(二)
  16. 环境的配置; host 配置地址
  17. VsCode之使用WebView通信
  18. 弗洛伊德算法Floyed(求各顶点间最短路径):可打印最短路径
  19. jmeter SMTP Sampler取样器发送测试结果邮件
  20. phpStudy安装

热门文章

  1. Verification之PSL之use
  2. Vs工程高版本向低版本迁移
  3. jQuery+pjax简单示例汇总
  4. (转)Openlayers 2.X加载高德地图
  5. Ad hoc polymorphism
  6. myeclipse加载buiding workspace慢解决方案
  7. Python批处理图片尺寸
  8. H3C交换机配置常用命令(转)
  9. 【转载】Java IO基础总结
  10. LA 3938