TabLayout自定義Tab第一次全部高亮

我使用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都是選中狀態

如果將程序稍作修改,僅僅是調換一下調用順序

//將三個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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容