有时候需要在onCreate种得到控件的宽,高等。但是通过getWidth(), getHeight(), getTop()等方法都无法获得控件真实值,只能得到0;这是因为View组件布局要在onResume()方法回调后才能完成。因为,我们可以通过getViewTreeObserver().addOnGlobleLayoutListener()来获取控件的宽高等。
addOnGlobleLayoutListener()是当一个视图树的布局发生改变时候,所要调用的回调函数接口。这是一个监听视图树的观察者(Observer),在视图树的全局事件改变时得到通知。
下面即是我们用addOnGlobleLayoutListener(),来获取一个视图的真实高度:
private TextView tv;
/***初始化得到view事件观察者***/
ViewTreeObserver observer = tv.getViewTreeObserver();
/**
*当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时,
*所要调用的回调函数的接口类
**/
observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//获取控件高度
imageHeight = mDetailProductIv.getHeight();
/***OnGloabalLayoutListener可能会被多次触发,因此在得到高度后要注销掉***/
observer.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
});
除了OnGlobalLayoutListener ,ViewTreeObserver还有如下内部类:
interface ViewTreeObserver.OnGlobalFocusChangeListener
当在一个视图树中的焦点状态发生改变时,所要调用的回调函数的接口类interface ViewTreeObserver.OnGlobalLayoutListener
当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时,所要调用的回调函数的接口类interface ViewTreeObserver.OnPreDrawListener
当一个视图树将要绘制时,所要调用的回调函数的接口类interface ViewTreeObserver.OnScrollChangedListener
当一个视图树中的一些组件发生滚动时,所要调用的回调函数的接口类interface ViewTreeObserver.OnTouchModeChangeListener
当一个视图树的触摸模式发生改变时,所要调用的回调函数的接口类