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

Ran*_*ku' 11 layout android handler postdelayed android-linearlayout

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

<LinearLayout ... layout_height="fill_parent">
     <ImageView ... layout_height="wrap_content" />
     <TextView ... layout_height="120dp" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

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

注:如果我打电话getHeight()onCreate,我得到0.

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

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

Ste*_*ley 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
}
Run Code Online (Sandbox Code Playgroud)

(我写道它是建议的大小,因为我认为可以根据布局限制在此之后更改大小.但是,这是我刚才读过的内容的模糊记忆,我从未详细试验过.)一旦你已经完成了,你可以使用大小来做你想做的事情 - 你甚至可以改变它将使用的大小setMeasuredDimension(newX, newY).

  • 这是一个很大的约束IMHO.在没有覆盖视图或布局或添加您不需要的按钮的情况下无法获得测量. (2认同)

sec*_*lpb 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
}
Run Code Online (Sandbox Code Playgroud)