2

我有一个 LinearLayout,这个 LinearLayout 将保存动态放置的视图。我需要找出 LinearLayout 子项的宽度,但这必须在 onCreate 方法中完成。通过研究,我发现您不能从此方法中使用 getWidth 。因此,我使用的是 onWindowFocusChanged,它适用于父 LinearLayout(返回实际大小),但不适用于其子级。

我注意到的另一件事是,当屏幕逐渐消失并且屏幕被锁定时,我可以在日志中看到返回的孩子的实际宽度(我认为活动正在暂停)。

我真的被卡住了,这是需要的,因为我需要根据孩子的宽度动态放置这些视图。

4

3 回答 3

5

您可能可以通过以下方式获得。但正如其他人指出的那样,这可能不是一个好主意。

LinearLayout.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
LinearLayout.getMeasuredWidth();
于 2012-06-06T23:15:23.253 回答
3

在onCreate里面,views仍然无法知道附近views和children等的状态……所以只有在所有的准备和布局过程完成之后,你才能得到views的大小。

这是在绘制视图之前获取视图大小的快速代码:

private static void runJustBeforeBeingDrawn(final View view, final Runnable runnable)
{
    final ViewTreeObserver vto = view.getViewTreeObserver();
    final OnPreDrawListener preDrawListener = new OnPreDrawListener()
    {
        @Override
        public boolean onPreDraw()
        {
            Log.d(App.APPLICATION_TAG, CLASS_TAG + "onpredraw");
            runnable.run();
            final ViewTreeObserver vto = view.getViewTreeObserver();
            vto.removeOnPreDrawListener(this);
            return true;
        }
    };
    vto.addOnPreDrawListener(preDrawListener);
}

或者,如果您愿意,您可以使用addOnGlobalLayoutListener而不是。addOnPreDrawListener

用法示例:

runJustBeforeBeingDrawn(view,new Runnable()
{
  @Override
  public void run()
  {
    int width=view.getWidth();
    int height=view.getHeight();
  }
});

另一种方法是使用 onWindowFocusChanged(并检查 hasFocus==true),但这并不总是最好的方法(仅用于简单的视图创建,而不用于动态创建)

编辑:替代 runJustBeforeBeingDrawn:https ://stackoverflow.com/a/28136027/878126

于 2012-06-06T23:03:21.253 回答
0

https://stackoverflow.com/a/3594216/1397218

所以你应该以某种方式改变你的逻辑。

于 2012-06-06T22:49:05.550 回答