我使用Design包下面的TabLayout布局的前提下,我通過自定義Tab的CustomView來實現定制化需求,這個時候問題來了
如果按照下面的代碼來寫
//這三句用來初始化Tab
TabLayout.Tab newTab =mBinding.layoutTab.newTab();
TabLayout.Tab hotTab =mBinding.layoutTab.newTab();
TabLayout.Tab distanceTab =mBinding.layoutTab.newTab();
//這三句用來設置自定義的View
newTab.setCustomView(tabView("最新"));
hotTab.setCustomView(tabView("最熱"));
distanceTab.setCustomView(tabView("距離"));
//給TabLayout增加一個監聽
mBinding.layoutTab.addOnTabSelectedListener(newTabLayout.ViewPagerOnTabSelectedListener(mBinding.viewPager));
//將三個Tab加入TabLayout
mBinding.layoutTab.addTab(newTab);
mBinding.layoutTab.addTab(hotTab);
mBinding.layoutTab.addTab(distanceTab);
當程序運行時第一次進入頁面會出現這個畫面
如果將程序稍作修改,僅僅是調換一下調用順序
//將三個Tab加入TabLayout
mBinding.layoutTab.addTab(newTab);
mBinding.layoutTab.addTab(hotTab);
mBinding.layoutTab.addTab(distanceTab);
//這三句用放到addTab調用之后
newTab.setCustomView(tabView("最新"));
hotTab.setCustomView(tabView("最熱"));
distanceTab.setCustomView(tabView("距離"));
當程序運行時會出現這個畫面
然后翻看TabLayout的源碼發現了問題所在,下圖是setCustomView的具體實現
final boolean isSelected = (mParent.getSelectedTabPosition() == getPosition());
這句話是關鍵,當我想當然的以為這個值在初始化肯定為false的時候,確驚奇的發現為true。
原來在TabLayout沒有addTab的時候,mParent.getSelectedTabPosition()返回了-1,而getPosition()
也返回了-1,所以導致了這個值返回為true,最終導致了錯誤的結果。具體的細節可以自行查看TabLayout源碼。閱讀源碼是提高自身的不二途徑。
最后我的Support包的版本是24.0.0