请看一下这个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时,我需要复制该限制功能。
答案 0 :(得分:2)
看来我太信任Eclipse了。在使用断点进行调试以检查应用程序的状态和许多可用变量的值时,我依赖于eclipse提供的变量列表,其中包括mMeasuredWidth / mMeasuredHeight。请注意,这些不是我的源代码中的变量。 Eclipse以某种方式自己找到它们,为我检查对象。因此我假设他们确实代表了测量的宽度/高度。然而,我的假设是错误的,只是因为视图可以用不同的方式测量(即使用MeasureSpec.UNSPECIFIED或MeasureSpec.EXACTLY),而eclipse无法知道我需要哪种测量。
因此,我通过添加到我的代码中触发了我需要的测量:
int measureSpecParams = View.MeasureSpec.getSize(View.MeasureSpec.UNSPECIFIED);
dataTableView.measure(measureSpecParams, measureSpecParams);
int measuredWidth = dataTableView.getMeasuredWidth();
int measuredHeight = dataTableView.getMeasuredHeight();
这确实给了我以后的视图大小,即如果父视图和屏幕限制它,“dataTable”视图的大小。