widthMeasureSpec 在 HorizontalScrollView 中为 0
widthMeasureSpec is 0 when in HorizontalScrollView
我正在 Android 中编写自定义视图。因为我需要精确的尺寸管理,所以我已经覆盖了 onMeasure。它的文档说,View.MeasureSpec.getMode returns 三个值之一,定义为常量。但是当我的视图放在 HorizontalScrollView 中时,widthMeasureSpec 为 0 - 我无法从中获取模式和大小。
更奇怪的是,即使我为我的视图明确定义了宽度,此参数仍为 0。
为什么会发生这种情况,我应该如何解释 0 值以及在这种特殊情况下我应该怎么做?
0
表示模式为UNSPECIFIED
。这意味着您可以随心所欲地变大,这是有道理的,因为它是一个 ScrollView
...比实际屏幕大 View
。
未指定,您不必关心大小,这就是为什么它是0
。
如果您查看 HorizontalScrollView
的源代码,您还可以看到它只是将 width: 0, UNSPECIFIED
传递给 child:
@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);
}
要获得与 parent 一样大的 child 视图,您可以使用 xml 或 java 中的 fillViewPort
,这将导致调用模式 EXACTLY
:
if (!mFillViewport) {
return;
}
// ...
int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);
这是处理与 ScrollView
一样大的 child 视图的一种方法。
我正在 Android 中编写自定义视图。因为我需要精确的尺寸管理,所以我已经覆盖了 onMeasure。它的文档说,View.MeasureSpec.getMode returns 三个值之一,定义为常量。但是当我的视图放在 HorizontalScrollView 中时,widthMeasureSpec 为 0 - 我无法从中获取模式和大小。
更奇怪的是,即使我为我的视图明确定义了宽度,此参数仍为 0。
为什么会发生这种情况,我应该如何解释 0 值以及在这种特殊情况下我应该怎么做?
0
表示模式为UNSPECIFIED
。这意味着您可以随心所欲地变大,这是有道理的,因为它是一个 ScrollView
...比实际屏幕大 View
。
未指定,您不必关心大小,这就是为什么它是0
。
如果您查看 HorizontalScrollView
的源代码,您还可以看到它只是将 width: 0, UNSPECIFIED
传递给 child:
@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);
}
要获得与 parent 一样大的 child 视图,您可以使用 xml 或 java 中的 fillViewPort
,这将导致调用模式 EXACTLY
:
if (!mFillViewport) {
return;
}
// ...
int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);
这是处理与 ScrollView
一样大的 child 视图的一种方法。