最近开了<android开发艺术探索>收货很多 ,很推荐这本书.
(2). view.post(runnable)
(3) ViewTreeObserver
进入正题, 很多时候你会发现在activity中获取不到view的 宽高. 获取的总是0, 这是因为view在measure的时候和activity的生命周期不是同步的, 创建好activity后view的measure还没有创建,所以得到的宽高自然是0. 下面推荐3种获取的方法 供大家分享:
(1). 通过onWindowFocusChanges
这个方法的含义是:View已经初始化完毕了, 宽高已经准备好了这时候去获宽高是没有问题的. 需要注意的是, onWindowFocusChange会被调用多次, 在activity失去和获取焦点的时候都会调用.如此平凡的进行调用肯定是不好的 ,解决如下:
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if(hasFocus){
int width = view.getMeasuredWidth();
int height = view.getMeasuredHeight();
}
}
(2). view.post(runnable)
通过post可以将一个runnable投递到消息队列的尾部,然后等待Lopper调用次runnable的时候, View也已经初始化好了, 代码如下:
protected void onStart() {
super.onPause();
view.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
int width = view.getMeasuredWidth();
int height = view.getMeasuredHeight();
}
});
}
(3) ViewTreeObserver
使用ViewTreeObserver的众多回调可以完成这个功能, 比如使用OnGlobalLayoutListener这个接口, 让View树的状态发生改变或者View树的内部的View
的可见性发生改变的时候,onGlobalLayout方法将被回调, 因此这是获取View的宽高一个最好的时机.需要注意的是, 伴随View的树的状态的改变等, onGlobalLayout也会被调用对此,解决代码如下
protected void onStart() {
super.onStart();
ViewTreeObserver observer = view.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// TODO Auto-generated method stub
int width = view.getMeasuredWidth();
int height = view.getMeasuredHeight();
}
});
}