當咱們將TabLayout與ViewPager結合時,會出現Tab標題不顯示的問題.java
mTabLayout.setupWithViewPager(viewPager);
從源碼裏找答案.
先看下方法調用流程
spa
大體流程如圖,這裏只給出populateFromPagerAdapter()方法源碼.code
void populateFromPagerAdapter() { removeAllTabs(); if (mPagerAdapter != null) { //返回ViewPager設置的PagerAdapter.getCount() final int adapterCount = mPagerAdapter.getCount(); for (int i = 0; i < adapterCount; i++) { //從新添加,並經過PagerAdapter.getPageTitle()爲tab設置標題 addTab(newTab().setText(mPagerAdapter.getPageTitle(i)), false); } // Make sure we reflect the currently set ViewPager item if (mViewPager != null && adapterCount > 0) { final int curItem = mViewPager.getCurrentItem(); if (curItem != getSelectedTabPosition() && curItem < getTabCount()) { selectTab(getTabAt(curItem)); } } } }
這個方法的第一步 removeAllTabs();
.圖片
/** * Remove all tabs from the action bar and deselect the current tab. */ public void removeAllTabs() { // Remove all the views for (int i = mTabStrip.getChildCount() - 1; i >= 0; i--) { removeTabViewAt(i); } for (final Iterator<Tab> i = mTabs.iterator(); i.hasNext();) { final Tab tab = i.next(); i.remove(); tab.reset(); sTabPool.release(tab); } mSelectedTab = null; }
移除了TabLayout添加的tab.
下一步final int adapterCount = mPagerAdapter.getCount();
則是返回你設置給ViewPager的PagerAdapter的getCount()返回值.ip
而後在for循環中 addTab(newTab().setText(mPagerAdapter.getPageTitle(i)),
添加新的tab,並將PagerAdapter.getPageTitle()
返回值設置爲tab的標題.rem
所以,當ViewPager
與TabLayout
結合使用時,沒必要給TabLayout
添加tab,也就是不用調用TabLayout.addTab()
.只須要重寫PagerAdapter.getPageTitle()
方法便可.get