我使用Design包下面的TabLayout布局的前提下幻捏,我通過自定義Tab的CustomView來實(shí)現(xiàn)定制化需求颠蕴,這個(gè)時(shí)候問題來了
如果按照下面的代碼來寫
//這三句用來初始化Tab
TabLayout.Tab newTab =mBinding.layoutTab.newTab();
TabLayout.Tab hotTab =mBinding.layoutTab.newTab();
TabLayout.Tab distanceTab =mBinding.layoutTab.newTab();
//這三句用來設(shè)置自定義的View
newTab.setCustomView(tabView("最新"));
hotTab.setCustomView(tabView("最熱"));
distanceTab.setCustomView(tabView("距離"));
//給TabLayout增加一個(gè)監(jiān)聽
mBinding.layoutTab.addOnTabSelectedListener(newTabLayout.ViewPagerOnTabSelectedListener(mBinding.viewPager));
//將三個(gè)Tab加入TabLayout
mBinding.layoutTab.addTab(newTab);
mBinding.layoutTab.addTab(hotTab);
mBinding.layoutTab.addTab(distanceTab);
當(dāng)程序運(yùn)行時(shí)第一次進(jìn)入頁面會(huì)出現(xiàn)這個(gè)畫面
如果將程序稍作修改椰于,僅僅是調(diào)換一下調(diào)用順序
//將三個(gè)Tab加入TabLayout
mBinding.layoutTab.addTab(newTab);
mBinding.layoutTab.addTab(hotTab);
mBinding.layoutTab.addTab(distanceTab);
//這三句用放到addTab調(diào)用之后
newTab.setCustomView(tabView("最新"));
hotTab.setCustomView(tabView("最熱"));
distanceTab.setCustomView(tabView("距離"));
當(dāng)程序運(yùn)行時(shí)會(huì)出現(xiàn)這個(gè)畫面
然后翻看TabLayout的源碼發(fā)現(xiàn)了問題所在骨望,下圖是setCustomView的具體實(shí)現(xiàn)
final boolean isSelected = (mParent.getSelectedTabPosition() == getPosition());
這句話是關(guān)鍵粪牲,當(dāng)我想當(dāng)然的以為這個(gè)值在初始化肯定為false的時(shí)候,確驚奇的發(fā)現(xiàn)為true赢织。
原來在TabLayout沒有addTab的時(shí)候亮靴,mParent.getSelectedTabPosition()返回了-1,而getPosition()
也返回了-1于置,所以導(dǎo)致了這個(gè)值返回為true茧吊,最終導(dǎo)致了錯(cuò)誤的結(jié)果。具體的細(xì)節(jié)可以自行查看TabLayout源碼。閱讀源碼是提高自身的不二途徑搓侄。
最后我的Support包的版本是24.0.0