android 开发技巧(11)--在 onCreate() 方 法 中 获 取 View 的 宽度和高度

这篇文章我直接照抄书上的吧,讲的很详细:

如果需要开发一些依赖于 UI 控件的宽和高的功能,开发者可能会用到 View 的 getHeight() 和 getWidth() 方法。对于新手来说这里有一个小陷阱值得注意:试图在 Activity 的 onCreate() 方法中获取控件的宽和高。遗憾的是如果开发者在 onCreate() 方法中调用上述方法,会发现返回值都是 0。

首先分析为什么在 Activity 的 onCreate() 方法中读取视图的尺寸会返回 0 值。当 onCreate() 方法被调用时,会通过 LayoutInflater 将XML 布局文件填充到 ContentView。填充过程只包括创建视图,却不包括设置其大小。那么,视图的大小是在何时指定的呢?
Android 开发文档的解释如下所示:
“绘制布局由两个遍历过程组成:测量过程和布局过程。测量过程由 measure(int, int) 方法完成,该方法从上到下遍历视图树。在递归遍历过程中,每个视图都会向下层传递尺寸和规格。当measure 方法遍历结束时,每个视图都保存了各自的尺寸信息。第二个过程由 layout(int, int, int, int) 方法完成,该方法也是由上而下遍历视图树,在遍历过程中,每个父视图通过测量过程的结果定位所有子视图的位置信息。”
结论如下:只有在整个布局绘制完毕后,视图才能得到自身的
高和宽,这个过程发生在 onCreate() 方法之后,因此,在此之前调
用 getHeight() 和 getWidth() 方法返回的结果都是 0。
把 XML 布局文件比喻成蛋糕食谱: LayoutInflater 类就是购买所有食材的人;测量和布局的过程就是蛋糕师的工作,最终的视图就是蛋糕本身。在 onCreate() 阶段,只是购买了制作蛋糕的食材,但是仅仅知道食材是不足以预知蛋糕最终大小的。开发者可以使用 View 的 post() 方法解决上述问题。该方法接收一个 Runnable 线程参数,并将其添加到消息队列中。有趣的是Runnable 线程会在 UI 线程中执行。使用 post() 方法的源码如下所示:

 final TextView mTextView = (TextView) findViewById(R.id.my_text_view);

        mTextView.post(new Runnable() {

            @Override
            public void run() {
                String size = String.format("TextView's width: %d, height: %d",
                        mTextView.getWidth(), mTextView.getHeight());
                mTextView.setText(size);

            }
        });
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值