被父级裁剪的 Android 视图的全尺寸
Posted
技术标签:
【中文标题】被父级裁剪的 Android 视图的全尺寸【英文标题】:Full size of an Android View being clipped by its parent 【发布时间】:2012-11-04 00:27:26 【问题描述】:请看一下这个 xml 布局。
<LinearLayout android:id="@+id/dataTableContainer"
android:orientation="vertical"
android:layout_
android:layout_
android:clipChildren="true">
<LinearLayout android:id="@+id/dataTable"
android:layout_
android:layout_
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 正在跟踪本机测量过程中的测量变量。很高兴听到您找到了可行的解决方案。
【参考方案1】:
看来我太信任 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”视图会有多大。
【讨论】:
以上是关于被父级裁剪的 Android 视图的全尺寸的主要内容,如果未能解决你的问题,请参考以下文章
来自 FormGroup 的禁用控件(表单自定义表单控件的一部分)被父级中的 .getRawValue() 排除