12

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

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

紧接着onCreate,我想知道ImageView的高度是多少。怎么做?

注意:如果我调用getHeight()onCreate我得到 0。

我也试过imageView.postDelayed,它适用于 2.1 模拟器,但在 1.5 模拟器上失败(我也得到了 0)。

最后,我尝试创建一个Handler,然后handler.postDelayed延迟 10 毫秒调用。它适用于 2.1 和 1.5 模拟器,但是当我在 eclipse 调试器中启动程序时失败(因此,我得出结论,使用延迟并不能保证在 imageview 布局之后发生高度的获取。)

4

2 回答 2

12

您获得大小为 0 的原因是布局在活动完全创建之后才完成,即 onCreate()、onStart() 和 onResume() 都已完成。我知道获得确切大小的最简单方法是在布局完成后调用您的方法,例如通过在按钮上使用单击侦听器。由于在布局完成之前不会显示按钮,因此在触发其单击侦听器时,该大小必须可用。

这只是一个猜测,但我想这很难做到,因为他们不希望人们在系统刚刚完成屏幕布局后弄乱布局大小。如果他们提供了“onLayoutFinished()”回调,那么如果您修改了其中的布局,您可能会陷入循环。例如想象:布局完成;onLayoutFinished() 调用并在那里修改布局;现有布局现在无效;重新布局;onLayoutFinished() 再次调用;您的代码再次被调用 - 等等。

另一种方法是制作自定义视图并覆盖该onMeasure(int, int)方法。系统触发该方法以获取每个 View 的大小;如果您使用类似下面的示例,您可以在布局完成之前获得建议的尺寸:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    //getMeasuredHeight() and getMeasuredWidth() now contain the suggested size
}

(我写了这是建议的大小,因为我认为在此之后可以根据布局限制更改大小。但是,这是我前一段时间读过的内容的模糊记忆,我从未详细尝试过。)一旦你已经这样做了,您可以将大小用于您想做的任何事情 - 您甚至可以使用setMeasuredDimension(newX, newY).

于 2010-05-19T10:04:41.597 回答
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
}
于 2011-01-01T18:28:19.093 回答