我使用Design包下面的TabLayout布局的前提下,我通過自定義Tab的CustomView來實現(xiàn)定制化需求,這個時候問題來了
如果按照下面的代碼來寫
//這三句用來初始化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增加一個監(jiān)聽
mBinding.layoutTab.addOnTabSelectedListener(newTabLayout.ViewPagerOnTabSelectedListener(mBinding.viewPager));
//將三個Tab加入TabLayout
mBinding.layoutTab.addTab(newTab);
mBinding.layoutTab.addTab(hotTab);
mBinding.layoutTab.addTab(distanceTab);
當(dāng)程序運行時第一次進入頁面會出現(xiàn)這個畫面

如果將程序稍作修改,僅僅是調(diào)換一下調(diào)用順序
//將三個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)程序運行時會出現(xiàn)這個畫面

然后翻看TabLayout的源碼發(fā)現(xiàn)了問題所在,下圖是setCustomView的具體實現(xiàn)
final boolean isSelected = (mParent.getSelectedTabPosition() == getPosition());
這句話是關(guān)鍵,當(dāng)我想當(dāng)然的以為這個值在初始化肯定為false的時候,確驚奇的發(fā)現(xiàn)為true。
原來在TabLayout沒有addTab的時候,mParent.getSelectedTabPosition()返回了-1,而getPosition()
也返回了-1,所以導(dǎo)致了這個值返回為true,最終導(dǎo)致了錯誤的結(jié)果。具體的細節(jié)可以自行查看TabLayout源碼。閱讀源碼是提高自身的不二途徑。
最后我的Support包的版本是24.0.0