前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TabLayout double click 标题回顶部

TabLayout double click 标题回顶部

作者头像
用户1127566
发布2018-06-06 16:11:51
1.2K0
发布2018-06-06 16:11:51
举报
文章被收录于专栏:Android 开发学习

背景

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

实现双击回顶部

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

代码语言:javascript
复制
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处赋值。

代码语言:javascript
复制
 public void setOnTabSelectedListener(OnTabSelectedListener onTabSelectedListener) {
        mOnTabSelectedListener = onTabSelectedListener;
    }

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

image.png

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

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

代码语言:javascript
复制
 public void onTabSelected(TabLayout.Tab tab) {
                isClickOnce = false;
                mSelectedPage = tab.getPosition();
              
            }

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.06.02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 实现双击回顶部
  • 我们搜索mOnTabSelectedListener的使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档