很早之前就遇到过在使用NestedScrollView的时候发现底部的View总是显示不全,看起来像是被底部的什padding遮挡了一样。
这次是一个recycleView,在list没有数据的时候总是显示不全,有数据的时候就正常了。子类控件高度都设置了wrap_content,还是没效果。以前都是直接在最下面的子控件加一个合适的layout_marginBottom。。今天刚好比较闲就决定找到原因,解决,也方便以后查阅。 解决方案
NestedScrollView加一句
android:fillViewport="true"
完美解决哈哈
原理
出现这个问题感觉应该是NestedScrollView的测量方法去找原因
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (!mFillViewport) {
return;
}
final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
if (heightMode == MeasureSpec.UNSPECIFIED) {
return;
}
if (getChildCount() > 0) {
View child = getChildAt(0);
final NestedScrollView.LayoutParams lp = (LayoutParams) child.getLayoutParams();
int childSize = child.getMeasuredHeight();
int parentSpace = getMeasuredHeight()
- getPaddingTop()
- getPaddingBottom()
- lp.topMargin
- lp.bottomMargin;
if (childSize < parentSpace) {
int childWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec,
getPaddingLeft() + getPaddingRight() + lp.leftMargin + lp.rightMargin,
lp.width);
int childHeightMeasureSpec =
MeasureSpec.makeMeasureSpec(parentSpace, MeasureSpec.EXACTLY);
child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
}
}
}
看到这里,mFillViewport,字面意思填充,如果是false被return出去,
if (!mFillViewport) {
return;
}```
看文档说明
private boolean mFillViewport;
翻译过来
设置为true时,滚动视图将测量其子级以使其填充当前*可见区域。
默认值为false,果然没有重新测量 ,所以在xml添加设置为true就解决了
作者:余震l