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