在Oncreat()方法中获取View的宽度和高度

来源:互联网 发布:福建省广电网络集团 编辑:程序博客网 时间:2024/06/07 19:43
正常情况下,在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());
  }
});
0 0