一般在Activity
onCreate(...)
onResume()
方法中都获取不到View的实际大小。
```
view.getWidth()
view.getHeight()
```
根本原因在于控件还没有完成绘制。
系统将何时绘制完View时呢?
将一个runnable添加到Layout队列中:View.post(new Runnable())
简单地说,在Runnable中实现run方法,View的measure、layout等事件后触发run
View.post(new runnable(
//这里实现回调方法
));
UI事件队列会按顺序处理事件。
在setContentView()被调用后,事件队列中会包含一个要求重新layout的message,所以任何你post到队列中的东西都会在Layout发生变化后执行。
final View view=//smth;
view.post(new Runnable() {
@Override
public void run() {
view.getHeight();//height is ready
}
});
其它方式
偶尔能获取成功,说明回调onResume()方法时,View不一定绘制完成,但是onResume()回调时,界面已经展示出了,为什么View还未绘制完成?
View绘制完成,回调onWindowFocusChanged(),在该方法中获取View的大小。