Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获得Android小部件';计算布局后的大小?_Android_Layout_Handler_Android Linearlayout_Postdelayed - Fatal编程技术网

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

如何获得Android小部件';计算布局后的大小?,android,layout,handler,android-linearlayout,postdelayed,Android,Layout,Handler,Android Linearlayout,Postdelayed,我有一个在相对维度中指定小部件大小的布局,例如: <LinearLayout ... layout_height="fill_parent"> <ImageView ... layout_height="wrap_content" /> <TextView ... layout_height="120dp" /> </LinearLayout> 在创建之后,我想知道ImageView的高度是多少。怎么做 注意:如果我在on

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

<LinearLayout ... layout_height="fill_parent">
     <ImageView ... layout_height="wrap_content" />
     <TextView ... layout_height="120dp" />
</LinearLayout>

在创建之后,我想知道ImageView的高度是多少。怎么做

注意:如果我在
onCreate
中调用
getHeight()
,我得到0

我还尝试了
imageView.postdayed
,它在2.1 emulator上工作,但在1.5 emulator上失败(我也得到了0)


最后,我尝试创建一个
处理程序
,然后以10毫秒的延迟调用
处理程序.postDelayed
。它在2.1和1.5 emulator中都能工作,但在我在eclipse调试器中启动程序时失败(因此,我得出结论,使用延迟不能保证在imageview布局完成后获得高度。)

将大小设置为0的原因是,直到完全创建活动后,布局才完成,即onCreate()、onStart()和onResume()都已完成。我所知道的获得确切大小的最简单方法是在布局完成后调用您的方法,例如使用按钮上的单击侦听器。由于按钮在布局完成后才会显示,因此在触发其click listener时,该大小必须可用

这只是一个猜测,但我想这是很难做到的,因为他们不希望人们在系统刚刚完成屏幕布局后就弄乱布局尺寸。如果他们提供了一个“onlayoufinished()”回调,那么如果您在其中修改布局,您可能会陷入循环。例如,想象:布局完成;调用onlayoufinished()并修改其中的布局;现有布局现在无效;重新布局;再次调用onlayoufinished();您的代码会再次被调用,以此类推

另一种方法是创建一个自定义视图并覆盖
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)

视图对象提供名为onSizeChanged(intw,inth,intoldw,intoldh)的方法来更改它将使用的大小。当布局更改其中一个组件的大小时,将调用它。如果重写此方法,则此方法版本中的代码将知道其自身的大小,如以下代码段所示

@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
}

非常感谢。听起来不错。我会试试的。这是一个很大的限制。无法在不覆盖视图或布局或添加不需要的按钮的情况下获取度量值。