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)就好,或者其他情况自己实现。

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

TabLayout double click 标题回顶部_第1张图片
image.png

我们搜索mOnTabSelectedListener的使用

发觉1处赋值。

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

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

TabLayout double click 标题回顶部_第2张图片
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。

你可能感兴趣的:(TabLayout double click 标题回顶部)