这真是一个头疼的问题,有时候获得的宽高就是0.
接下来我们来试试这几个方法。 1.onWindowFocusChanged onWindowFocusChanged: View已经初始化完毕了,宽高已经准备好了。这个时候去获取宽高是没有问题的。需要注意的是,onWindowFocusChange会被调用多次。 当Activity的窗口得到焦点和失去焦点时均会被调用一次,具体来说,当Activity继续执行和暂停执行时。onWindowFocusChanged均会被调用,如果频繁地进行onResume和onPause,那么onWindowFocusChanged,也会被频繁的调用。
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if(hasFocus){
// view.getMeasuredHeight();写获取宽高的方法
}
}
2.view.post(runnable) 通过post可以将一个runnable投递到消息对列的尾部,然后等待looper调用runnable的时候View已经初始化了。(艹,笔者写的这个东西我竟然一知半解)
@Override
protected void onStart() {
super.onStart();
view.post(new Runnable() {
@Override
public void run() {
// view.getMeasuredHeight();写获取宽高的方法
}
});
}
3.ViewTreeObserver 使用ViewTreeObserver的众多回调可以完成这个功能,比如使用OnGlobaLayoutListener这个接口。 当View树的状态发生改变或者View树内部的View的可见性发生变化时。onGlobalLayout方法将会被回调,因此这是获取View的宽高一个很好的时机。但是伴随着View树的状态的改变,onGlobalLayout会被调用多次。
@Override
protected void onStart() {
super.onStart();
ViewTreeObserver observer = searchViewLayout.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
searchViewLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
int width = searchViewLayout.getMeasuredWidth();
}
});
}
对于这个onGlobalLayout方法我是印象深刻,我记得我在那家公司写代码时,把一个服务器请求写在了这里面。由于那家公司没有什么测试,代码检查方面的流程。基本上开发写好代码自己测试一下就上线。一上线就遭到不少客户投诉。 “什么鬼,劳资打开你们的应用,一个小时吃掉我五十多兆流量?” “what the hell?”
4.view.measure(); 具体代码长这样:
@Override
protected void onStart() {
super.onStart();
int widthSpce = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY);
int heightSpce = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY);
searchViewLayout.measure(widthSpce,heightSpce);
int width = searchViewLayout.getMeasuredWidth();
}
由于比较复杂,就不多描述。自己去探索吧。 ###注意:以上方法都没有经过测试,使用的时候小心有坑。### 来自Android开发艺术探索(真是一本好书!)