在扩展ViewGroup时正确实现onMeasure()

时间:2013-04-18 14:17:21

标签: android grid-layout

其中一个Android示例(FixedGridLayout)扩展ViewGroup以允许在将新项目添加到网格时进行自定义转换。代码按预期工作,但不实现滚动。因此,我将整个布局包裹在ScrollView中,期望这可以解决问题。但是,看起来FixedGridLayout视图实际上比它应该大得多,在项目之后留下了很多可滚动空间。

我怀疑这个问题与onMeasure()的实现方式有关。我是对的,如果是的话,这段代码有什么问题?

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int cellWidthSpec = MeasureSpec.makeMeasureSpec(mCellWidth, MeasureSpec.AT_MOST);
    int cellHeightSpec = MeasureSpec.makeMeasureSpec(mCellHeight, MeasureSpec.AT_MOST);

    int count = getChildCount();
    for (int index=0; index<count; index++) {
        final View child = getChildAt(index);
        child.measure(cellWidthSpec, cellHeightSpec);
    }

    // Use the size our parents gave us, but default to a minimum size to avoid
    // clipping transitioning children
    int minCount =  count > 3 ? count : 3;
    setMeasuredDimension(resolveSize(mCellWidth * minCount, widthMeasureSpec),
            resolveSize(mCellHeight * minCount, heightMeasureSpec));
}

1 个答案:

答案 0 :(得分:0)

ScrollView仅在测量内部子视图后垂直高度,但它不会滚动,除非内部子项将高度设置为大于父项的高度。

您可以在内部视图上调用getHeight(),看看它是否计算出的值大于您的预期值。该方法仅在布局完成后才有效。

您发布的代码似乎确实存在错误。

int minCount =  count > 3 ? count : 3;
setMeasuredDimension(resolveSize(mCellWidth * minCount, widthMeasureSpec),
        resolveSize(mCellHeight * minCount, heightMeasureSpec));

代码根据子项数设置widthheight。如果我假设网格布局模式,则宽度计算为mCellWidth * columns,高度计算为mCellHeight * rows

如果使用子项总数设置高度值,则可以解释为什么滚动超出布局底部的原因。