ScrollView.scrollTo(0,0)不生效的解决办法

2018-06-06  本文已影响878人  学点东西吧6

需求

我们在项目中经常会遇到 tab 页切换的情况,比如通过底部导航栏从 Fragment1 切换到 Fragment2 ,这时候有一个需求:Fragment1 里包含了 ScrollView ,并且已经滚动了一部分,要求从 Fragment2 切换回来的时候,Fragment1 滚动到顶部位置。

方案

    @Override
    public void onHiddenChanged(boolean hidden) {
        super.onHiddenChanged(hidden);
        if (!hidden) {
            mScrollView.scrollTo(0, 0);
        }
    }

但是很可惜不能达到项目要求。

    @Override
    public void onHiddenChanged(boolean hidden) {
        super.onHiddenChanged(hidden);
        if (!hidden) {
            mScrollView.post(new Runnable() {
                @Override
                public void run() {
                    mScrollView.scrollTo(0,0);
                }
            });
        }
    }
    @Override
    public void onHiddenChanged(boolean hidden) {
        super.onHiddenChanged(hidden);
        if (!hidden) {
            mScrollView.post(new Runnable() {
                @Override
                public void run() {
                    mScrollView.scrollTo(0,0);
                    mScrollView.smoothScrollTo(0, 0);
                }
            });
        }
    }

原理

阅读源码后,得知 ScrollView.scrollTo(x,y)FragmentonHiddenChanged(boolean hidden) 生命周期时,还没有计算出滚动条的尺寸,无法正确的 offset 到目的位置。

参考链接

scrollview-scrollto-not-working-saving-scrollview-position-on-rotation

scrollview-scrollto-doesnt-work

Android笔记:ScrollView 的scrollTo(x,y)初始化方法

上一篇下一篇

猜你喜欢

热点阅读