3

请看一下这个 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 时,我需要复制该限制功能。

4

1 回答 1

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”视图会有多大。

于 2012-11-05T11:14:12.147 回答