美文网首页
ScrollView.scrollTo(0,0)不生效的解决办法

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

作者: 学点东西吧6 | 来源:发表于2018-06-06 16:59 被阅读878次

    需求

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

    方案

    • 我们很自然的会想到切换 Fragment 会调用 onHiddenChanged(boolean hidden) 生命周期,只需要判断 !hidden 的时候,执行 ScrollViewscrollTo(x,y) 方法即可:
        @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);
                    }
                });
            }
        }
    
    • 经过测试发现如果 Fragment1ScrollView 处于滚动状态时就切换到 Fragment2 ,再切换回来之前的代码依然不起效,这里会很自然的想到加一个延迟效果去,调用 View.postDelay() 方法,但是依然不起效。正确的做法是在执行完 scrollTo(x,y) 之后再执行 smoothScrollTo(x,y) 方法。
        @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)初始化方法

    相关文章

      网友评论

          本文标题:ScrollView.scrollTo(0,0)不生效的解决办法

          本文链接:https://www.haomeiwen.com/subject/ujzbsftx.html