下面这段代码有坑...
//获取字符数组
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
这个方法导致的,然后翻了下源码,终于找到了问题所在。
我们在方法中找到这样一个方法
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