View何时在Android中知道自己的大小? (宽度和高度)

时间:2014-02-03 20:24:38

标签: android view

我对所有被调用的方法感到困惑,因为在任何地方都没有View-lifecycle描述,我想知道Android View何时知道它的确切大小,所以它可以告诉观察者? 也许onLayout或onMeasure的方法很有用,但我正在寻找实现这一目标的最佳方法。 谢谢!

2 个答案:

答案 0 :(得分:3)

在屏幕上绘制视图之前,视图不知道自己的大小。要在绘制值后获取值,您可以使用OnGlobalLayoutListener,如下所示:

<yourView>.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            //getWidth() and getHeight() now have values
            //you can remove this layout listener too if you don't need it anymore
        }
    }
);

答案 1 :(得分:1)

是的,你猜对了 - onMeasure()这是第一次看到有关其尺寸的信息。顺便说一句,onMeasure()可能会被调用几次,具体取决于布局的复杂性。

引自Jason Ostrender的“Android UI Fundamentals Develop and Design”

  

系统调用onMeasure方法来确定其大小   观点及其子女。它实际上传递了两个整数   MeasureSpecs。 MeasureSpec只是模式标志和的组合   整数大小的值。它被实现为一个整数来减少   不需要的对象分配。该模式告诉视图应该如何   计算它的大小。这些是可能的模式:

     

指定。父视图对此视图没有任何约束;   它可以是任何尺寸。
  最多。视图可以是任何尺寸   超过或等于MeasureSpec尺寸   究竟。视图将是   完全符合MeasureSpec尺寸,无论它要求什么。

     

创建自定义视图并覆盖onMeasure方法时,它就是   你的工作是妥善处理这些案件。除此之外   测量合同规定您调用setMeasuredDimensions   具有确定的整数大小值的方法。如果你做不到   这样,就会抛出IllegalStateException。

因此,父视图告诉子视图他必须遵守的一些约束,并且子计算它自己的大小,假定这些信息。

如果您想了解如何正确使用onMeasure()的示例,可以查看此https://gist.github.com/syndarin/8799233。我前段时间玩过自定义视图,这是我的一个实验 - 简单的形状视图,方形或圆形。