Android TabLayout setupWithViewPager()方法绑定Viewpager不显示文字

移动开发 创建于:2022-01-10

setupWithViewPager() 做了什么事情~


TabLayout tabLayout = findViewById(R.id.tabLayout);
ViewPager viewPager= findViewById(R.id.viewPager);
List<Fragment> fragments = new ArrayList<>();
···

tabLayout.addTab(tabLayout.newTab().setText("tab1"));
tabLayout.addTab(tabLayout.newTab().setText("tab2"));
tabLayout.addTab(tabLayout.newTab().setText("tab3"));

fragments.add(MeFragment.newInstance());;
PageAdapter pageAdapter = new PageAdapter(getSupportFragmentManager());
viewPager.setAdapter(pageAdapter);
tabLayout.setupWithViewPager(viewPager);
···



pic



TabLayout addTab设置setText(CharSequence text)
viewPager.setAdapter(pageAdapter);
tabLayout.setupWithViewPager(viewPager);
如果没有重写 PageAdapter的getPageTitle()会出现tab没有设置的titile。

重写 PageAdapter的getPageTitle() tab正常显示。

pc

源码分析:

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有兴趣可以深入分析。

原文地址:https://blog.csdn.net/junerain25/article/details/122389225

免责声明:本文来源于互联网,版权归合法拥有者所有,如有侵权请公众号联系管理员

* 本站提供的一些文章、资料是供学习研究之用,如用于商业用途,请购买正版。

旧时光っ