开始本人打算使用Metrial design风格设计做毕业设计的
本来打算做成这个样子
然后就开始兴冲冲的写起了代码,
先写布局文件,嗯,没有问题,预览效果不错
然后去查阅api看看怎么用
TabLayout tabLayout = ...;
tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));
tabLayout.addTab(tabLayout.newTab().setText("Tab 3"));
文档上这么写,我也这么写,写完之后创建一个Viewpager+Adapter+TabLayout
使用官方推荐的setupWithViewPager()方法绑定(话说我原来封装过一个绑定Viewpager和自定义Tab的工具包,我以为官方对于绑定的处理有我一样贴心,后来发现我错了)
。。。。。。
显示出来的结果是这样的
。。。。。。。
卧槽,我的字呢
。。。是不是颜色不对
。。。是不是字号不对
我好想意识到了问题出在哪!
于是我注释掉了这行代码
。。。。
果然。。。。虽然失去了联动效果,但是字出来了
。。。。。
我不甘心
。。。。。继续注释
。。。。。。。
结果是这个样子的。。。我把设置tab的方法注释了,为毛线还有tab呢(下面的下划线明显地指明了有四个tab)
。。。
突然,好像意识到了哪里不对。。。
好了,卧槽。。。。好了。。。
然后我瞅了瞅源码
不截图了,直接贴源码
public void setupWithViewPager(@NonNull ViewPager viewPager) {
final PagerAdapter adapter = viewPager.getAdapter();
if (adapter == null) {
throw new IllegalArgumentException("ViewPager does not have a PagerAdapter set");
}
// First we'll add Tabs, using the adapter's page titles
setTabsFromPagerAdapter(adapter);
// Now we'll add our page change listener to the ViewPager
viewPager.addOnPageChangeListener(new TabLayoutOnPageChangeListener(this));
// Now we'll add a tab selected listener to set ViewPager's current item
setOnTabSelectedListener(new ViewPagerOnTabSelectedListener(viewPager));
// Make sure we reflect the currently set ViewPager item
if (adapter.getCount() > 0) {
final int curItem = viewPager.getCurrentItem();
if (getSelectedTabPosition() != curItem) {
selectTab(getTabAt(curItem));
}
}
}
看到源码的第一反应是,貌似没什么问题吧,先检查以下Viewpager有没有正确的设置适配器,没有设置则抛异常。。然后。。。。。
// First we'll add Tabs, using the adapter's page titles
setTabsFromPagerAdapter(adapter);
咦。。。卧槽。。。这货是啥,好奇的我点了进去
public void setTabsFromPagerAdapter(@NonNull PagerAdapter adapter) {
removeAllTabs();
for (int i = 0, count = adapter.getCount(); i < count; i++) {
addTab(newTab().setText(adapter.getPageTitle(i)));
}
}
瞬间一万头神兽从我脑海里奔驰而过。。。。
谁允许你清空了,谁让你new新Tab啦。。。。。
这思路还没有我年少无知时候封装的代码人性化呢好吧(见我分享的代码,我再次基础上封装了新的代码,新代码没有上传)
而且注释里也并没有说这货会removedAllTab();
/**
* The one-stop shop for setting up this {@link TabLayout} with a {@link ViewPager}.
*
* <p>This method will:
* <ul>
* <li>Add a {@link ViewPager.OnPageChangeListener} that will forward events to
* this TabLayout.</li>
* <li>Populate the TabLayout's tabs from the ViewPager's {@link PagerAdapter}.</li>
* <li>Set our {@link TabLayout.OnTabSelectedListener} which will forward
* selected events to the ViewPager</li>
* </ul>
* </p>
*
* @see #setTabsFromPagerAdapter(PagerAdapter)
* @see TabLayoutOnPageChangeListener
* @see ViewPagerOnTabSelectedListener
*/