TabLayout+ViewPager+Fragment结合使用以及遇到的问题(Kotlin)

下面这段代码有坑…

//获取字符数组
val tabs: Array<String> = resources.getStringArray(R.array.tabs)
//添加Tab
tabs.forEach { mTabLayout.addTab(mTabLayout.newTab()) }
//设置Tab文字
tabs.forEachIndexed { index, s -> mTabLayout.getTabAt(index)?.text = s  }
//关联ViewPager联动
mTabLayout.setupWithViewPager(mViewPager)
//给ViewPager设置Adapter
val tabsAdapter = TabsAdapter(supportFragmentManager, tabs)
mViewPager.adapter = tabsAdapter

遇到的问题

运行Demo后TabLayout上的字符没了,当时一脸懵逼;然后在网上查了下,发现是setupWithViewPager这个方法导致的,然后翻了下源码,终于找到了问题所在。

《TabLayout+ViewPager+Fragment结合使用以及遇到的问题(Kotlin)》 TabLayout字符为空

我们在方法中找到这样一个方法

 void populateFromPagerAdapter() {
     /**
     * Remove all tabs from the action bar and deselect the current tab.
     * 清除actionBar上和当前TableLayout上的所有Tab
     */
        removeAllTabs();

        if (mPagerAdapter != null) {
            //获取ViewPager Adapter中的getCount的数量
            final int adapterCount = mPagerAdapter.getCount();
            for (int i = 0; i < adapterCount; i++) {
                //重新给TabLayout添加Tab,并且设置标题(getPageTitle)
                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));
                }
            }
        }
    }

根据上面的分析我们知道了问题的根源,如果要使用setupWithViewPager关联ViewPager,添加Tab的操作我们就不用管了,只要在ViewPager的Adapter中实现getPageTitle方法就好了,下面我们就可以改造了。

修改后的代码

val tabs: Array<String> = resources.getStringArray(R.array.tabs)
val tabsAdapter = TabsAdapter(supportFragmentManager, tabs)
mViewPager.adapter = tabsAdapter
mTabLayout.setupWithViewPager(mViewPager)

Adapter


inner class TabsAdapter(fm: FragmentManager?, var tabs: Array<String>) : FragmentPagerAdapter(fm) {

       override fun getItem(position: Int): Fragment {
           return if (position == 0)
               EmojiFragment()
           else
               MeiziFragment()
       }

       override fun getCount(): Int = 2

       override fun getPageTitle(position: Int): CharSequence = tabs[position]

   }

Demo下载欢迎Star

    原文作者:许渺
    原文地址: https://www.jianshu.com/p/f3667d949774
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞