【发布时间】:2012-11-04 00:27:26
【问题描述】:
请看一下这个 xml 布局。
<LinearLayout android:id="@+id/dataTableContainer"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:clipChildren="true">
<LinearLayout android:id="@+id/dataTable"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"/>
</LinearLayout>
在运行时,“dataTable”元素填充了比“dataTableContainer”可以显示的更宽的子元素。但是,当我在 Eclipse 中检查两个元素的 mMeasuredWidth(甚至是 getWidth() 的返回值)时,它们结果是完全相同的。这不应该是这样。我的理解是,“dataTable”的孩子应该推动它假设自己的宽度,因为它的“wrap_content”设置。相反,“dataTableContainer”应该比它小,因为它的“fill_parent”设置受屏幕尺寸的限制。
我也尝试将“clipChildren”设置为 false,以防宽度被容器裁剪但结果保持不变:表格和容器的宽度相同。
谁能解释发生了什么?
为了给您一些背景信息,我试图做的是收集这些元素的大小,以确定有多少“dataTable”元素位于容器外部,因此不可见。这反过来又需要限制用户可以拖动表格元素的距离。 ScrollView 元素本身会限制运动,但由于我使用的是 LinearLayout,因此我需要复制该限制功能。
【问题讨论】:
-
内层
LinearLayout不能大于外层,因此宽度相等似乎是合理的。你真的需要根元素是LinearLayout吗?你能把dataTableContainer换成ScrollView吗? -
感谢您的评论@acj。我认为假设内部元素不能大于外部元素并不那么安全。当然在视觉上它不能,但在内部我会认为渲染引擎知道(并存储在某处)内部元素想要更大但被外部元素剪裁。因此,我预计测量的宽度与 getWidth() 返回的值之间存在差异。
-
回答你的问题@acj,我不能使用ScrollView,因为我正在尝试创建一个简单的2D ScrollView,它可以水平和垂直滚动。我已经看到了解决方案,但对于我需要做的事情来说,它们似乎有点矫枉过正。拖动内部元素已经可以了,但我不知道如何限制它的运动,以免它离开屏幕!
-
documentation for View drawing 提到“[a] 视图的测量宽度和测量高度值必须尊重视图父级施加的约束”。测量通过后,视图的所需宽度/高度似乎被丢弃。除了填充
dataTable,您是否以编程方式更改内部布局的大小或行为? -
我的理解是父视图对其子视图施加测量约束,除非您另有说明,这正是您的方法所做的。我认为 Eclipse 正在跟踪本机测量过程中的测量变量。很高兴听到您找到了可行的解决方案。
标签: android layout view size android-linearlayout