大家很多时候需要在Activity或者Fragment的onCreate()方法中获取声明的空间的高度或者宽度,进行位置移动或者其他操作,但是当调用 view.getHeight() 或者 view.getWidth() 获取的竟然为0。。。

其实很容易理解,在onCreate()的时候,实际上控件只是声明了,并没有绘制完成,没有attach到window上,所以导致获取的高度和宽度为0,那么该怎么解决呢?

三种方式

1、使用下面的post方式

view.post(new Runnable() {     @Override     public void run() {         int height = view.getHeight() ;         int width = view.getWidth();      }});

原理:

  • View.post(Runnable) 内部会自动分两种情况处理,当 View 还没 attachedToWindow 时,会先将这些 Runnable 操作缓存下来;否则就直接通过 mAttachInfo.mHandler 将这些 Runnable 操作 post 到主线程的 MessageQueue 中等待执行。

  • 如果 View.post(Runnable) 的 Runnable 操作被缓存下来了,那么这些操作将会在 dispatchAttachedToWindow() 被回调时,通过 mAttachInfo.mHandler.post() 发送到主线程的 MessageQueue 中等待执行。

想了解更多请去查看源码。相信你可以更深层次的理解。

View.post() 中的操作执行时,View 的宽高已经计算完毕,所以可以在 Activity 的 onCreate() 里调用 View.post() 来解决获取 View 宽高为0的问题

2、使用ViewTreeObserver的方式

ViewTreeObserver vto = view.getRabbit().getViewTreeObserver();vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {    public boolean onPreDraw() {        if(vto.isAlive()){            vto.removeOnDrawListener(this);        }        int height = view.getMeasuredHeight());        return true;    }});

ViewTreeObserver 注册一个观察者来监听视图树,当视图树的布局、视图树的焦点、视图树将要绘制、视图树滚动等发生改变时,ViewTreeObserver都会收到通知。所以 这个方法会调用很多次,如果要使用这种方法的话,要做好规避调用多次,记得移除监听;ViewTreeObserver不能被实例化,可以调用View.getViewTreeObserver()来获得。

3、还有一种不太推荐

@Overridepublic void onWindowFocusChanged(boolean hasFocus) {    super.onWindowFocusChanged(hasFocus);    int height = view.getHeight()    int width = view.getHeight();}

这个函数的含义是:view已经初始化完毕了,宽/高已经准备好了,这个时候去获取宽高是可以成功获取的。需要注意的是 onWindowFocusChanged函数会被调用多次,当Activity的窗口得到焦点和失去焦点时均会被调用一次,如果频繁地进行onResume和onPause,那么onWindowFocusChanged也会被频繁地调用,不太适合处理一些复杂的业务逻辑

更多相关文章

  1. [置顶] Android 开发之旅:view的几种布局方式及实践
  2. Android数据库事务操作
  3. 谈谈我的Android多渠道打包方式
  4. Android 是Google开发的基于Linux平台的开源手机操作系统
  5. android 解析服务器数据使用json还是xml方式
  6. android中的两种打包方式,及多渠道打包
  7. Android Training - 网络操作(3) - 解析XML数据
  8. android内存溢出处理方式之一

随机推荐

  1. uclinux-2008R1.5-RC3(bf561)到VDSP5的移
  2. Linux 常用命令之文件和目录
  3. Linux入门学习(五)
  4. linux的设置ip连接crt,修改主机名,映射,建文
  5. kernel module编程(七):通过读取proc文件进
  6. Linux基础命令杂记
  7. linux 系统级别安全
  8. 我已提取并尝试使用启动脚本(./start navi
  9. Linux 查询文件内容重复数 uniq
  10. ARMv8(aarch64)页表建立过程详细分析