计算布局后如何获取Android小部件的大小? [英] How to get an Android widget's size after layout is calculated?

查看:39
本文介绍了计算布局后如何获取Android小部件的大小?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a layout which specifies sizes of widgets in relative dimension, for example:

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

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

Immediately after onCreate, I want to know how much is the height of the ImageView. How to do that?

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

Note: If I call getHeight() in onCreate, I get 0.

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

I have also tried imageView.postDelayed, it works on 2.1 emulator but fails on 1.5 emulator (I got 0, too).

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

Finally, I tried to create a Handler, and then I call handler.postDelayed with 10 ms delay. It works in both 2.1 and 1.5 emulator, but failed when I start the program in eclipse debugger (So, I conclude that using the delay doesn't guarantee that the getting of the height happens after the imageview is layout-ted.)

推荐答案

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

The reason you're getting a size of 0 is that the layout isn't finished until after the activity is fully created, i.e. onCreate(), onStart() and onResume() have all gone through. The easiest way I know of to get the exact size is to call your method after the layout has finished, such as by using a click listener on a button. Since the button isn't displayed until the layout is finished, the size must be available by the time its click listener is fired.

这只是一个猜测,但我认为这很难准确地做到,因为他们不希望人们在系统刚刚完成屏幕布局后就搞乱布局大小.如果他们提供了onLayoutFinished()"回调,那么如果您修改了布局,您可能会陷入循环.例如,想象一下:布局完成;调用 onLayoutFinished() 并在其中修改布局;现有的布局现在无效;重新布局;onLayoutFinished() 再次调用;您的代码再次被调用 - 依此类推.

This is only a guess, but I imagine that this is difficult to do precisely because they don't want people messing with layout sizes once the system has just finished laying out the screen. If they provided a "onLayoutFinished()" callback, then you could get yourself stuck in a loop if you modified the layout in that. For example, imagine: layout is completed; onLayoutFinished() called and you modify the layout in there; the existing layout is now invalid; layout re-done; onLayoutFinished() called again; your code gets called again - and so forth.

另一种方法是创建自定义视图并覆盖 onMeasure(int, int) 方法.系统触发该方法获取每个View的大小;如果你使用我下面的例子,你可以在布局完成之前获得建议的尺寸:

Another way to do it is to make a custom View and override the onMeasure(int, int) method. The system triggers that method to get the size of each View; if you use something like my example below, you can get the suggested size before the layout is finished:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    //getMeasuredHeight() and getMeasuredWidth() now contain the suggested size
}

(我写道这是建议的大小,因为我认为在此之后根据布局限制可能会更改大小.但是,这是我前段时间读到的东西的模糊记忆,我从未进行过详细的实验.) 完成此操作后,您可以将大小用于任何您想做的事情 - 您甚至可以使用 setMeasuredDimension(newX, newY) 更改它将使用的大小.

(I wrote that it's the suggested size because I think it's possible for the size to be changed after this based on layout constraints. However, that's a vague memory of something I read a while ago, and I never experimented in detail.) Once you've done that, you can use the size for whatever it is you wanted to do - you can even change the size it will use by using setMeasuredDimension(newX, newY).

这篇关于计算布局后如何获取Android小部件的大小?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆