2

Android 示例之一 ( FixedGridLayout) 扩展了 aViewGroup以允许在将新项目添加到网格时进行自定义转换。该代码按预期工作,但没有实现滚动。因此,我将整个布局包装起来,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));
}
4

1 回答 1

0

ScrollView测量后只关心内部子视图的垂直高度,但除非内部子级将高度设置为大于父级,否则它不会滚动。

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

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

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

代码是根据孩子的总数width设置和。如果我假设一个网格布局模式,那么宽度计算为,高度计算为。heightmCellWidth * columnsmCellHeight * rows

如果您使用孩子的总数设置高度值,那么这将解释为什么您滚动超出了布局的底部。

于 2013-06-02T01:25:13.933 回答