在Horizo​​ntalScrollView中,widthMeasureSpec为0

时间:2016-02-23 22:14:07

标签: android custom-view

我正在Android中编写自定义视图。由于我需要精确的尺寸管理,我已经超越了测量。它的文档说,View.MeasureSpec.getMode返回三个值中的一个,定义为常量。但当我的视图放在Horizo​​ntalScrollView中时,widthMeasureSpec为0 - 我无法从中获得模式和大小。

甚至更奇怪的是,即使我明确为视图定义宽度,此参数也为0。

为什么会这样,我应该如何解释0值以及在这种特殊情况下该怎么做?

1 个答案:

答案 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一样大的一种方法。