其中一个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));
}
答案 0 :(得分:0)
ScrollView
仅在测量内部子视图后垂直高度,但它不会滚动,除非内部子项将高度设置为大于父项的高度。
您可以在内部视图上调用getHeight()
,看看它是否计算出的值大于您的预期值。该方法仅在布局完成后才有效。
您发布的代码似乎确实存在错误。
int minCount = count > 3 ? count : 3;
setMeasuredDimension(resolveSize(mCellWidth * minCount, widthMeasureSpec),
resolveSize(mCellHeight * minCount, heightMeasureSpec));
代码根据总子项数设置width
和height
。如果我假设网格布局模式,则宽度计算为mCellWidth * columns
,高度计算为mCellHeight * rows
。
如果使用子项总数设置高度值,则可以解释为什么滚动超出布局底部的原因。