【问题标题】:How to get an Android widget's size after layout is calculated?计算布局后如何获取Android小部件的大小?
【发布时间】:2010-05-19 09:40:28
【问题描述】:

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

<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)。

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

【问题讨论】:

    标签: android layout handler android-linearlayout postdelayed


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 非常感谢。听起来是这样。我会试试的。
    • 恕我直言,这是一个很大的限制。如果不覆盖视图或布局或添加您并不真正需要的按钮,则无法获取度量值。
    【解决方案2】:

    View 对象提供名为 onSizeChanged(int w, int h, int oldw, int oldh) 的方法。当布局更改其组件之一的大小时调用它。如果您覆盖此方法,则此方法版本中的代码将知道自身的大小,如以下 sn-p 所示。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      • 2013-08-19
      • 2017-05-24
      • 1970-01-01
      相关资源
      最近更新 更多