我正在Android中编写自定义视图。由于我需要精确的尺寸管理,我已经超越了测量。它的文档说,View.MeasureSpec.getMode返回三个值中的一个,定义为常量。但当我的视图放在HorizontalScrollView中时,widthMeasureSpec为0 - 我无法从中获得模式和大小。
甚至更奇怪的是,即使我明确为视图定义宽度,此参数也为0。
为什么会这样,我应该如何解释0值以及在这种特殊情况下该怎么做?
答案 0 :(得分:1)
0
表示模式为UNSPECIFIED
。这意味着你可以尽可能大,这是有道理的,因为它是ScrollView
...用于比你的实际屏幕更大的View
。
未指明,您不必关心尺寸,这就是0
的原因。
如果您查看HorizontalScrollView
的来源,您还可以看到它只是将width: 0, UNSPECIFIED
传递给了孩子:
@Override
protected void measureChild(View child, int parentWidthMeasureSpec, int parentHeightMeasureSpec) {
ViewGroup.LayoutParams lp = child.getLayoutParams();
int childWidthMeasureSpec;
int childHeightMeasureSpec;
childHeightMeasureSpec = getChildMeasureSpec(parentHeightMeasureSpec, mPaddingTop
+ mPaddingBottom, lp.height);
childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
}
要让子视图与父视图一样大,您可以使用xml或java中的fillViewPort
,这将导致模式EXACTLY
的调用:
if (!mFillViewport) {
return;
}
// ...
int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);
这是处理您的子视图与ScrollView
一样大的一种方法。