今天在做应用时想要利用TabLayout+ViewPager实现标签页,却遇到了一点小问题,
在使用 tabLayout.setupWithViewPager(vp_demo);这个方法使tablayout与viewpager联动时,发现我之前tablayout填充的title变为空白了。
原来是:
使用之后:
开始认为既然是空白就在使用了setupWithViewPager 方法之后重新添加。结果是空白标签右边多了几个标签。从图中的横线也能看出标签添加
是成功的,只是上面的title没有显示。
解决方法一:可以在调用setupWithViewPager之后分别设置title。
tabLayout.getTabAt(0).setText("今日推荐"); tabLayout.getTabAt(1).setText("实用技巧"); tabLayout.getTabAt(2).setText("校园说说"); tabLayout.getTabAt(3).setText("时事热点");虽然可以解决,但是有点不知道为什么,通过查看源码:
private void setupWithViewPager(@Nullable final ViewPager viewPager, boolean autoRefresh, boolean implicitSetup) { if (mViewPager != null) { // If we've already been setup with a ViewPager, remove us from it if (mPageChangeListener != null) { mViewPager.removeOnPageChangeListener(mPageChangeListener); } if (mAdapterChangeListener != null) { mViewPager.removeOnAdapterChangeListener(mAdapterChangeListener); } } if (mCurrentVpSelectedListener != null) { // If we already have a tab selected listener for the ViewPager, remove it removeOnTabSelectedListener(mCurrentVpSelectedListener); mCurrentVpSelectedListener = null; } if (viewPager != null) { mViewPager = viewPager; // Add our custom OnPageChangeListener to the ViewPager if (mPageChangeListener == null) { mPageChangeListener = new TabLayoutOnPageChangeListener(this); } mPageChangeListener.reset(); viewPager.addOnPageChangeListener(mPageChangeListener); // Now we'll add a tab selected listener to set ViewPager's current item mCurrentVpSelectedListener = new ViewPagerOnTabSelectedListener(viewPager); addOnTabSelectedListener(mCurrentVpSelectedListener); final PagerAdapter adapter = viewPager.getAdapter(); if (adapter != null) { // Now we'll populate ourselves from the pager adapter, adding an observer if // autoRefresh is enabled setPagerAdapter(adapter, autoRefresh); } //代码省略。。。看到调用了setPagerAdapter方法,查看源码:
private void setPagerAdapter(@Nullable final PagerAdapter adapter, final boolean addObserver) { if (mPagerAdapter != null && mPagerAdapterObserver != null) { // If we already have a PagerAdapter, unregister our observer mPagerAdapter.unregisterDataSetObserver(mPagerAdapterObserver); } mPagerAdapter = adapter; if (addObserver && adapter != null) { // Register our observer on the new adapter if (mPagerAdapterObserver == null) { mPagerAdapterObserver = new PagerAdapterObserver(); } adapter.registerDataSetObserver(mPagerAdapterObserver); } // Finally make sure we reflect the new adapter populateFromPagerAdapter(); } private void populateFromPagerAdapter() { removeAllTabs();//可以通过函数名看出,这个函数remove了tab if (mPagerAdapter != null) { final int adapterCount = mPagerAdapter.getCount(); for (int i = 0; i < adapterCount; i++) { addTab(newTab().setText(mPagerAdapter.getPageTitle(i)), false); //通过上面函数可以看出,由于mPagetAdapter.getPagetTitle为空,所以在移除title之后, //set 空字符到 tab 所以tab为空, } // 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)); } } } } //省略代码、、通过查看源码,我们明白了原因,同时也找到另一种解决方法。给viewpager的adapter增加一个getPagTitle方法,我增加的如下
public String getPageTitle(int position){ return fragments.get(position).getTitle(); }也可以正确解决问题。
总结:看源码,通常可以解决8 ,9 成自己遇到的问题。