TabLayout double click 标题回顶部

背景

产品同学要求了一个很反常的需求,双击tab标题,回到页面顶部,哎,作为一名程序猿首先想到的是pk掉,无奈之下做了本功能。于是就发现了google 的sdk里面的bug,哎,写这些代码的人多半是实习生(锅先甩出去,逃~~)

实现双击回顶部

这里的实现实际上很简单,唯一难点在于怎么区分单击还是双击(tab切换)。不多说,很快就写出如下代码:

tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {

            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                isClickOnce = false;
                mSelectedPage = tab.getPosition();
              
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {
                int selectedPosition = tab.getPosition();
                if (selectedPosition == mSelectedPage) {
                    long currentTime = System.currentTimeMillis();
                    if (isClickOnce && currentTime - mLastPressTime <= DOUBLE_PRESS_INTERVAL) {
                        Fragment fragment = mPagerAdapter.getFragment(mSelectedPage);
                        if (fragment != null) {
          
                           ...
                        } else if (fragment != null) {
                            ...
                        }
                        isClickOnce = false;
                    } else {
                        isClickOnce = true;
                        mLastPressTime = currentTime;
                    }
                }
            }
        });

基本思想是是否是再次选中,如果是再次选中,则标记为已单击过一次,如果已单击过一次且两次间隔不超过双击时长,则判定为双击。 省略号为调用对应fragment回到顶部的代码。一般来说fragment的内容为listView,调用scrollToPosition(0)就好,或者其他情况自己实现。

写完了代码,来运行一把,会发觉双击后没有任何反应,再次断点你会发觉,也没进入断点,没办法了,断点源代码回调的地方,你会发现,
断点进入了源代码的回调了的,那么是为什么没有回调呢?

image.png

我们搜索mOnTabSelectedListener的使用

发觉1处赋值。

 public void setOnTabSelectedListener(OnTabSelectedListener onTabSelectedListener) {
        mOnTabSelectedListener = onTabSelectedListener;
    }

正式本文的回调处。
奇怪,为什么没回调呢?
我们搜索setOnTabSelectedListener调用处。可以看到,不仅我们赋值了,系统也赋值了,坑呀。

image.png

系统在设置setupWithViewPager的时候,顺便就设置了setOnTabSelectedListener,如果以前设置了的话,这里会覆盖,盖。。。。

所以sdk 的 setOnTabSelectedListener是设置有bug的。知道了原因,我们想要获取tabLayout的点击事件,必须在setupWithViewPager其之后,相当于我们覆盖系统的,这时,你会发觉我们的代码有点小bug,

 public void onTabSelected(TabLayout.Tab tab) {
                isClickOnce = false;
                mSelectedPage = tab.getPosition();
              
            }

需要反选中viewPager(viewPager.setCurrentItem(mSelectedPage);),不然,点击切换不了Fragment。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,964评论 25 709
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,267评论 4 61
  • 我不记得什么时候开始,在家我不再光着脚丫子乱跑,而是时时刻刻的穿着拖鞋; 也不记得从什么时候开始不再厌烦秋裤,不...
    dfffd66bf50d阅读 270评论 0 0
  • Call it life experience or the school of hard knocks, by ...
    呆萌小地鼠阅读 475评论 1 0
  • 早上起来点开海岚老师的讲座不知不觉又听了一遍,因为陈小冠喜欢画画,海岚老师的讲座我很有感触,有妈妈私我怎么做画画启...
    木木sani阅读 247评论 0 0