我们知道在oncreate中View.getWidth和View.getHeight无法获得一个view的高度和宽度,这是因为View组件布局要在onResume回调后完成。所以现在需要使用getViewTreeObserver().addOnGlobalLayoutListener()来获得宽度或者高度。这是获得一个view的宽度和高度的方法之一。

OnGlobalLayoutListener 是ViewTreeObserver的内部类,当一个视图树的布局发生改变时,可以被ViewTreeObserver监听到,这是一个注册监听视图树的观察者(observer),在视图树的全局事件改变时得到通知。ViewTreeObserver不能直接实例化,而是通过getViewTreeObserver()获得。

除了OnGlobalLayoutListener ,ViewTreeObserver还有如下内部类:


interface ViewTreeObserver.OnGlobalFocusChangeListe ner 当在一个视图树中的焦点状态发生改变时,所要调用的回调函数的接口类
interface ViewTreeObserver.OnGlobalLayoutListener 当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时,所要调用的回调函数的接口类
interface ViewTreeObserver.OnPreDrawListener 当一个视图树将要绘制时,所要调用的回调函数的接口类
interface ViewTreeObserver.OnScrollChangedListener 当一个视图树中的一些组件发生滚动时,所要调用的回调函数的接口类
interface ViewTreeObserver.OnTouchModeChangeListene r 当一个视图树的触摸模式发生改变时,所要调用的回调函数的接口类


其中,我们可以利用OnGlobalLayoutListener来获得一个视图的真实高度

int mHeaderViewHeight;mHeaderView.getViewTreeObserver().addOnGlobalLayoutListener(        new OnGlobalLayoutListener() {            @Override            public void onGlobalLayout() {                                                                                                                                                                                                                                                      mHeaderViewHeight = mHeaderView.getHeight();                getViewTreeObserver()                        .removeGlobalOnLayoutListener(this);            }        });

但是需要注意的是 OnGlobalLayoutListener 可能会被多次触发,因此在得到了高度之后,要将 OnGlobalLayoutListener 注销掉。



转自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0731/1640.html

更多相关文章

  1. Android温故之-Service
  2. Activity的onConfigurationChanged事件
  3. Android(安卓)屏幕(View)坐标系统
  4. Android(安卓)6.0 MT流程
  5. Android的Activity什么时候会调用onCreate()而不调用onStart()?
  6. android调用第三方库——第一篇
  7. 详解OkSocket与Android的简单使用
  8. Android使用KSOAP2调用WebService及正确导入jar包的问题
  9. 【5年Android从零复盘系列之六】Android自定义View(1):基础

随机推荐

  1. 申请阿里云免费的DV证书
  2. 动态合并工作表,放到哪里也能刷新
  3. 计算折旧月数,实用才是硬道理
  4. iOS多线程面试题分析
  5. SSL证书有哪些类型?如何去选择?
  6. iMove 如何输出影片、mp4 档案格式及调整
  7. iOS188面试题面试题整理,底层、技术亮点公
  8. 苹果 iMac Pro 官网已售罄, iMac Pro 最终
  9. 实现敏捷框架的比较:Scrum 方法 vs 看板方
  10. centos7 系统自带的OpenJDK切换成的Oracl