问题:
很多时候我们在做自定义View的时候都会在ScrollView中添加子布局,然而常常发现运行的时候ScroView会自动滑动到最底端。比如我在自定义ScrollView中用代码添加了几个布局,运行的时候它会直接滑动到最底部。这不是我们想要的效果,我们不想让它进来时显示最底部的内容,或者说不想让它滑动最底部。
思考:
很多人会和我一样既然它会自动滑动到最底部,那我们再让它滑动到最顶部不就行了吗?事实上这样是不行的。因为我们是在初始化的时候调用scrollTo方法的,但是在初始化的时候整个ScrollView还没有layout结束,然后我们看看ScrollView的onLayout方法的最后一行:
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
...
// Calling this with the present values causes it to re-claim them
scrollTo(mScrollX, mScrollY);
}
它会调用 scrollTo方法,在这里它滑动到了最底部,而且是在初始化之前调用的,也就是说在我们调用了scrollTo之后调用的,所以我们写的scrollTo方法自然也就看不到效果了。
- 解决方法
我们可以重写scrollTo方法,并且把super.scrollTo注释掉,这样就我们就禁用了scrollTo方法:
@Override
public void scrollTo(int x, int y) {
// super.scrollTo(x, y);
Log.i("CC", "scrollTo:X:" + x + ",Y:" + y);
}
或者实现自定义的scrollTo方法,调用一下父类的scrollTo方法,比如:
public void mScrollTo(int x, int y) {
super.scrollTo(x, y);
}
总结
如果自定义ScrollView出现直接滑动到底部的情况,可以重写scrollTo方法并且注释掉super.scrollTo方法。在需要使用srollTo的地方使用super.scrollTo。