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).
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)
| 归档时间: |
|
| 查看次数: |
20336 次 |
| 最近记录: |