【问题标题】:Measure a layout before adding views in it?在添加视图之前测量布局?
【发布时间】:2013-06-28 20:16:20
【问题描述】:

我有一个 RelativeLayout 作为根元素。根元素下有三个 LinearLayout。第一个和最后一个具有固定高度,中间的占据屏幕的其余部分。

中间的LinearLayout里面有两个ScrollView。我以编程方式在其中添加新视图。无论屏幕大小如何,我都想在滚动视图中显示三个项目。

问题是,我无法计算 are 的高度,所以我无法将其除以三并获得所需的项目高度。

我尝试调用 measure() 和 getMeasuredHeight() 但 LinearLayout 返回 21(我不知道为什么)并且 ScrollViews 返回 0。LinearLayout 和 ScrollViews 都有 match_parent 属性。

那么我怎样才能得到实际的高度呢?我知道它是在某处计算的,因为我可以看到它覆盖了所有空白区域。

【问题讨论】:

  • AFAIK 视图和布局在您的 onCreate 方法中尚未显示,它们只是被初始化。之后,Android 系统会根据像素密度和屏幕分辨率将它们“适配”到您的屏幕上。根据您的应用程序和所需的逻辑,您应该找到一种方法从onCreate 中获取这些措施。

标签: android scrollview android-relativelayout


【解决方案1】:

好人

除非你有充分的理由,否则不要这样做。这种布局不适用于平板电脑和更大的设备(拥有巨大的列表项看起来很奇怪),而且这种行为并不常见。

坏人

您说顶视图和底视图具有固定大小,您可以通过以下方式获取屏幕高度:

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
// Use getSize on API13+
int displayHeight = display.getHeight();

那么每一行的高度就是

int listHeight = displayHeight - (2 * fixedHeight)
int rowHeight = listHeight/3;

这很糟糕,因为它不适用于更复杂的布局。

丑陋的

onCreate 中,您的视图大小尚未初始化。您需要等到视图被指定大小。有几种方法可以做到这一点:

  • 使用View.OnLayoutChangeListener(API 11+)
  • 使用ViewTreeObserver.OnGlobalLayoutListener(API 1+)
  • 创建自定义视图类(子类LinearLayout)并覆盖onSizeChanged

【讨论】:

  • 我并没有真正考虑什么时候计算的。我将为这个项目使用“The Bad”方式,并为下一个项目使用“The Good”方式。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
相关资源
最近更新 更多