正常情况下,在OnCreate()方法中直接获取View的宽度和高度取得值是0。
原因:当OnCreate()方法被调用时,会通过LayoutInflater将XML布局文件填充到
contentView。填充过程只包括创建视图,却不包括设置大小。那么,视图的大小
是如何指定的呢?
绘制布局由两个遍历过程组成:测量过程和布局过程。测量过程由measure()方法
完成,该方法从上而下遍历视图树,在递归遍历的过程中,每个视图都会向下层传递尺寸和规格
当方法结束时,每个视图都会保存各自的尺寸和规格。
布局过程由layout()方法完成,该方法也是有上而下遍历视图树,在遍历过程中,每个父视图通过
测量过程的结果定位所有子视图的位置信息。
结论:只有在整个布局绘制完毕后,视图才能得到自身的高和宽,这个过程发生在OnCreate()方法之后,因此
在此之前调用getHeight()和getWidth()方法返回的结果都是0.
解决方法就是可以使用,view的post()方法解决上述问题,该方法受到一个Runnable线程参数,并将其添加到消息
队列中。有趣的是Runnable线程会在UI线程中执行。代码如下:
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
View view = findViewById(R.id.main_my_view);
view.post(new Runnable(){
@override
public void run() {
Log.d(TAG, "view has width :" + view.getWidth() + " and height: " + view.getHeight());
}
});
}