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

时间:2010-05-19 09:40:29

标签: android layout handler android-linearlayout postdelayed

我有一个布局,用于指定相对维度中小部件的大小,例如:

<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,然后以10毫秒的延迟调用handler.postDelayed。它适用于2.1和1.5模拟器,但是当我在eclipse调试器中启动程序时失败(因此,我得出结论,使用延迟并不能保证在imageview布局后获得高度。)

2 个答案:

答案 0 :(得分:11)

您获得大小为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)更改其使用的大小。

答案 1 :(得分: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
}