我对所有被调用的方法感到困惑,因为在任何地方都没有View-lifecycle描述,我想知道Android View何时知道它的确切大小,所以它可以告诉观察者? 也许onLayout或onMeasure的方法很有用,但我正在寻找实现这一目标的最佳方法。 谢谢!
答案 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。我前段时间玩过自定义视图,这是我的一个实验 - 简单的形状视图,方形或圆形。