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

我有一个布局来指定相对维度中小部件的大小,例如:
<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).

最后,我试图创建一个处理程序,然后我以10 ms的延迟调用handler.postDelayed.它在2.1和1.5模拟器中工作,但是当我在eclipse调试器中启动程序时失败(所以我得出结论,使用延迟并不能保证在viewview被布局之后发生高度).

解决方法

你得到大小为0的原因是布局在完成活动后才完成,即onCreate(),onStart()和onResume()都已经完成.我知道获得确切大小的最简单的方法是在布局完成后调用方法,例如通过在按钮上使用点击监听器.由于在布局完成之前不显示按钮,所以在触发点击侦听器的时候,该大小必须可用.

这只是一个猜测,但是我想像这是很难准确的,因为一旦系统刚刚完成屏幕布局,他们就不希望人们搞乱布局尺寸.如果他们提供了一个“onLayoutFinished()”回调,那么如果你修改了那个布局,那么你可以让自己陷入循环.例如,想象:布局完成; onLayoutFinished()被调用,你修改了那里的布局;现有布局现在无效;布局重新完成; onLayoutFinished()再次调用;你的代码再次被调用 – 等等.

另一种方法是使自定义View并覆盖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)来改变它将使用的大小.

相关文章

Android 如何解决dialog弹出时无法捕捉Activity的back事件 在...
Android实现自定义带文字和图片的Button 在Android开发中经常...
Android 关于长按back键退出应用程序的实现最近在做一个Andr...
android自带的时间选择器只能精确到分,但是对于某些应用要求...