setupWithViewPager() 做了什么事情~
TabLayout tabLayout = findViewById(R.id.tabLayout);
ViewPager viewPager= findViewById(R.id.viewPager);
List<Fragment> fragments = new ArrayList<>();
···
tabLayout.addTab(tabLayout.newTab().setText("首页"));
tabLayout.addTab(tabLayout.newTab().setText("热门"));
tabLayout.addTab(tabLayout.newTab().setText("我的"));
fragments.add(MeFragment.newInstance());;
PageAdapter pageAdapter = new PageAdapter(getSupportFragmentManager());
viewPager.setAdapter(pageAdapter);
tabLayout.setupWithViewPager(viewPager);
···
TabLayout addTab设置setText(CharSequence text)
viewPager.setAdapter(pageAdapter);
tabLayout.setupWithViewPager(viewPager);
如果没有重写 PageAdapter的getPageTitle()会出现tab没有设置的titile。
重写 PageAdapter的getPageTitle() tab正常显示。
源码分析:
setupWithViewPager() 做了什么事情~
public void setupWithViewPager(@Nullable ViewPager viewPager) {
setupWithViewPager(viewPager, true);
}
public void setupWithViewPager(@Nullable final ViewPager viewPager, boolean autoRefresh) {
setupWithViewPager(viewPager, autoRefresh, false);
}
private void setupWithViewPager(
@Nullable final ViewPager viewPager, boolean autoRefresh, boolean implicitSetup) {
···
if (viewPager != null) {
this.viewPager = viewPager;
···
//获取viewPager PagerAdapter
final PagerAdapter adapter = viewPager.getAdapter();
if (adapter != null) {
setPagerAdapter(adapter, autoRefresh);
}
}
void setPagerAdapter(@Nullable final PagerAdapter adapter, final boolean addObserver) {
if (pagerAdapter != null && pagerAdapterObserver != null) {
// If we already have a PagerAdapter, unregister our observer
pagerAdapter.unregisterDataSetObserver(pagerAdapterObserver);
}
pagerAdapter = adapter;
if (addObserver && adapter != null) {
// Register our observer on the new adapter
if (pagerAdapterObserver == null) {
pagerAdapterObserver = new PagerAdapterObserver();
}
adapter.registerDataSetObserver(pagerAdapterObserver);
}
// Finally make sure we reflect the new adapter
populateFromPagerAdapter();
}
···
//重点
void populateFromPagerAdapter() {
removeAllTabs();
if (pagerAdapter != null) {
final int adapterCount = pagerAdapter.getCount();
for (int i = 0; i < adapterCount; i++) {
addTab(newTab().setText(pagerAdapter.getPageTitle(i)), false);
}
// Make sure we reflect the currently set ViewPager item
if (viewPager != null && adapterCount > 0) {
final int curItem = viewPager.getCurrentItem();
if (curItem != getSelectedTabPosition() && curItem < getTabCount()) {
selectTab(getTabAt(curItem));
}
}
}
}
}
总结
重点关注方法:
populateFromPagerAdapter()
addTab(newTab().setText(pagerAdapter.getPageTitle(i)), false);
分析做了什么:
remove所有的Tab
重新addTab
设置pagerAdapter.getPageTitle(i)
所以:如果没有重写:
public CharSequence getPageTitle(int position)
默认返回null
所以不会显示 Tablayout addTab时setText(CharSequence text)
ps:
Tablayout内部其它View:
Tab、TabView、SlidingTabIndicator有兴趣可以深入分析。