如何在计算布局后获取Android小部件的大小?

12

我有一个布局,它使用相对尺寸指定小部件的大小,例如:

<LinearLayout ... layout_height="fill_parent">
     <ImageView ... layout_height="wrap_content" />
     <TextView ... layout_height="120dp" />
</LinearLayout>

onCreate方法之后,我想知道 ImageView 的高度。如何实现?

注意:如果我在onCreate中调用getHeight()方法,将返回0。

我也尝试过imageView.postDelayed方法,在2.1模拟器上可以工作,但在1.5模拟器上失败了(我还是得到了0)。

最后,我尝试创建一个Handler,并使用延迟10毫秒来调用handler.postDelayed。它在2.1和1.5模拟器上都可以工作,但在使用eclipse调试程序时失败了(因此,我得出结论,使用延迟不能保证在ImageView布局完成之后再获取其高度)。

2个回答

12
你得到大小为0的原因是布局直到活动完全创建(即onCreate(),onStart()和onResume()已经完成)之后才完成。我所知道的最简单的获得确切大小的方法是在布局完成后调用你的方法,比如使用按钮上的点击侦听器。由于按钮直到布局完成才显示,因此当其点击监听器被触发时,大小必须可用。
这只是一个猜测,但我想这很难做到精确,因为他们不希望在系统刚刚完成屏幕布局后就改变布局大小。如果他们提供了一个“onLayoutFinished()”回调函数,那么如果您在其中修改布局,则可能会陷入循环中。例如,想象一下:布局完成;调用onLayoutFinished()并在其中修改布局;现有布局现在无效;重新布局;再次调用onLayoutFinished();您的代码再次被调用-如此往复。
另一种方法是制作自定义视图并覆盖onMeasure(int, int)方法。系统触发该方法以获取每个视图的大小;如果您使用像下面示例中的东西,您可以在布局完成之前获得建议的大小。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    //getMeasuredHeight() and getMeasuredWidth() now contain the suggested size
}

我写这个是因为我认为建议的大小可能会根据布局约束条件而改变。然而,那是我很久以前读过的模糊记忆,我没有进行详细的实验。

一旦你完成了这个步骤,你可以将尺寸用于任何你想要做的事情——你甚至可以通过使用setMeasuredDimension(newX, newY)来更改它将使用的大小。


非常感谢。听起来不错。我会尝试的。 - Randy Sugianto 'Yuku'
2
在我看来,这是一个很大的限制。不能在不覆盖视图或布局或添加不需要的按钮的情况下获取度量。 - Sébastien

7

View对象提供了名为onSizeChanged(int w,int h,int oldw,int oldh)的方法。 当布局更改其组件之一的大小时,将调用该方法。 如果您重写此方法,则此方法版本中的代码将知道自身的大小,如以下片段所示。

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    bounds = new Rect();
    this.getDrawingRect(bounds);
    // bounds will now contain none zero values
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接