背景
产品同学要求了一个很反常的需求,双击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)就好,或者其他情况自己实现。
写完了代码,来运行一把,会发觉双击后没有任何反应,再次断点你会发觉,也没进入断点,没办法了,断点源代码回调的地方,你会发现,
断点进入了源代码的回调了的,那么是为什么没有回调呢?
我们搜索mOnTabSelectedListener的使用
发觉1处赋值。
public void setOnTabSelectedListener(OnTabSelectedListener onTabSelectedListener) {
mOnTabSelectedListener = onTabSelectedListener;
}
正式本文的回调处。
奇怪,为什么没回调呢?
我们搜索setOnTabSelectedListener调用处。可以看到,不仅我们赋值了,系统也赋值了,坑呀。
系统在设置setupWithViewPager的时候,顺便就设置了setOnTabSelectedListener,如果以前设置了的话,这里会覆盖,盖。。。。
所以sdk 的 setOnTabSelectedListener是设置有bug的。知道了原因,我们想要获取tabLayout的点击事件,必须在setupWithViewPager其之后,相当于我们覆盖系统的,这时,你会发觉我们的代码有点小bug,
public void onTabSelected(TabLayout.Tab tab) {
isClickOnce = false;
mSelectedPage = tab.getPosition();
}
需要反选中viewPager(viewPager.setCurrentItem(mSelectedPage);),不然,点击切换不了Fragment。