最近在做一个小程序,用到ScrollView的时候坑了我半天的时间。
问题描述:ScrollView中的内容不能完全显示
首先是一个跟这个问题无关的问题,布局中的fitsSystemWindows设为true为导致内容飘到状态栏后面去。
回到主题。新手,刚开始遇到这个问题,无从下手,只能靠搜索引擎。
先是有说是因为外层控件设置了margin,导致View下移。尝试把所有margin删掉,无效。
看到有提到ScrollView和ListView嵌套会出问题,于是调转方向,往这个方向走。五花八门的答案看的我一愣一愣,有写的很完整的,有从别人那儿照葫芦画瓢搬来结果还理解错了的,也是醉了。在将几乎所有可能的方法都试过无效后,我决定还是自己想想办法。
与此同时有一个很奇怪的事情就是程序刚加载的时候是显示不全的,但是当打开侧边菜单再返回后,显示就正常了。于是根据这个现象,猜测这个过程中某个View的高度发生了变化。顺着这个思路,插入测试代码,试了几次后,发现ScrollView的高度的确发生了变化,但是外层的CoordinatorLayout高度却没有变。与ScrollView并列的是一个AppBarLayout,再次测试,AppBarLayout的高度也没有变,奇了怪了。搜了一搜AppBarLayout + ScrollView,找到一篇文章提到CollapsingToolbarLayout,于是对AppBarLayout进行改造测试,虽然没有解决问题,但是又提供了一些思路。然后又找到一个问题,Toolbar will not collapse with Scrollview as child of CoordinatorLayout,根据答案将ScrollView改为NestedScrollView,无效。但这两个信息合起来后给了我启发,collapse?再去查AppBarLayout,来到了这里《玩转AppBarLayout,更酷炫的顶部栏》,在Toolbar中添加app:layout_scrollFlags="scroll|enterAlways",运行,滑动,AppBarLayout收起,ScrollView显示正常,问题解决。
推测是初始加载计算ScrollView的高度的时候没有减去AppBarLayout的高度,导致ScrollView的高度过大,超出了屏幕范围,内容其实是被“显示”出来了,只不过看不到。以后有时间再深入研究一下这个问题。