widthMeasureSpec 在 Horizo​​ntalScrollView 中为 0

widthMeasureSpec is 0 when in HorizontalScrollView

我正在 Android 中编写自定义视图。因为我需要精确的尺寸管理,所以我已经覆盖了 onMeasure。它的文档说,View.MeasureSpec.getMode returns 三个值之一,定义为常量。但是当我的视图放在 Horizo​​ntalScrollView 中时,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 视图的一种方法。