背景
產(chǎn)品同學(xué)要求了一個(gè)很反常的需求,雙擊tab標(biāo)題掌呜,回到頁面頂部滓玖,哎,作為一名程序猿首先想到的是pk掉质蕉,無奈之下做了本功能势篡。于是就發(fā)現(xiàn)了google 的sdk里面的bug,哎模暗,寫這些代碼的人多半是實(shí)習(xí)生(鍋先甩出去殊霞,逃~~)
實(shí)現(xiàn)雙擊回頂部
這里的實(shí)現(xiàn)實(shí)際上很簡(jiǎn)單,唯一難點(diǎn)在于怎么區(qū)分單擊還是雙擊(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;
}
}
}
});
基本思想是是否是再次選中棒卷,如果是再次選中顾孽,則標(biāo)記為已單擊過一次,如果已單擊過一次且兩次間隔不超過雙擊時(shí)長(zhǎng)比规,則判定為雙擊若厚。 省略號(hào)為調(diào)用對(duì)應(yīng)fragment回到頂部的代碼。一般來說fragment的內(nèi)容為listView蜒什,調(diào)用scrollToPosition(0)就好测秸,或者其他情況自己實(shí)現(xiàn)。
寫完了代碼,來運(yùn)行一把霎冯,會(huì)發(fā)覺雙擊后沒有任何反應(yīng)铃拇,再次斷點(diǎn)你會(huì)發(fā)覺,也沒進(jìn)入斷點(diǎn)沈撞,沒辦法了慷荔,斷點(diǎn)源代碼回調(diào)的地方,你會(huì)發(fā)現(xiàn)缠俺,
斷點(diǎn)進(jìn)入了源代碼的回調(diào)了的显晶,那么是為什么沒有回調(diào)呢?
我們搜索mOnTabSelectedListener的使用
發(fā)覺1處賦值壹士。
public void setOnTabSelectedListener(OnTabSelectedListener onTabSelectedListener) {
mOnTabSelectedListener = onTabSelectedListener;
}
正式本文的回調(diào)處磷雇。
奇怪,為什么沒回調(diào)呢躏救?
我們搜索setOnTabSelectedListener調(diào)用處唯笙。可以看到落剪,不僅我們賦值了睁本,系統(tǒng)也賦值了,坑呀忠怖。
系統(tǒng)在設(shè)置setupWithViewPager的時(shí)候呢堰,順便就設(shè)置了setOnTabSelectedListener,如果以前設(shè)置了的話凡泣,這里會(huì)覆蓋枉疼,蓋。鞋拟。骂维。。
所以sdk 的 setOnTabSelectedListener是設(shè)置有bug的贺纲。知道了原因航闺,我們想要獲取tabLayout的點(diǎn)擊事件,必須在setupWithViewPager其之后猴誊,相當(dāng)于我們覆蓋系統(tǒng)的潦刃,這時(shí),你會(huì)發(fā)覺我們的代碼有點(diǎn)小bug懈叹,
public void onTabSelected(TabLayout.Tab tab) {
isClickOnce = false;
mSelectedPage = tab.getPosition();
}
需要反選中viewPager(viewPager.setCurrentItem(mSelectedPage);)乖杠,不然,點(diǎn)擊切換不了Fragment澄成。