背景
我用过 PagerSlidingTabStrip库很长一段时间,以在 ViewPager 上方显示选项卡。
最近,我的任务是为选项卡设置图标(使用选择器,具有选中与未选中状态)而不是文本,所以我做到了。然而,图书馆似乎不能很好地处理它,有时会显示空标签,所以我搬到了 TabLayout ,它是 Google 设计库的一部分
问题
我注意到一些关于如何将图标添加到 TabLayout 的解决方案,但每个解决方案都有一个或多个问题:
- 没有图标显示
- 图标会显示,但会不时闪烁,尤其是在设置了“exitFadeDuration”的情况下使用选择器时,或者快速滑动时
- 单击选项卡不会更改 viewPager 的当前页面。
代码
我使用的代码来自cheesesquare示例,在 MainActivity.java 文件中。这是非常基本的:
final TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
...
tabLayout.setupWithViewPager(viewPager);
我尝试过的解决方案是:
为每个选项卡设置一个图标(并删除适配器的“getPageTitle”代码):
for (int i = 0; i < tabLayout.getTabCount(); i++) tabLayout.getTabAt(i).setIcon(...);
还尝试在我不使用选择器时添加 setOnTabSelectedListener。
此解决方案会导致闪烁效果(问题 #2)。
扩展 TabLayout 以支持图标或实现 TabViewProvider,如图所示 here .
扩展 TabLayout 根本不显示图标(问题 #1),实现 TabViewProvider 有闪烁图标的问题(尽管很少见)。
对于 getPageTitle,返回一个包含图标的 SpannableString,如图所示 here .这根本没有为我显示图标。
我记得我也尝试过其他解决方案,但它们也存在我提到的问题。
问题
为选项卡设置图标的正确方法是什么?
有没有官方的方法来实现这个?我想至少为每个选项卡选择和未选择的图像。选择时的过渡是一个很好的奖励,我希望实现这一点,因为这样看起来更好。
为什么图标总是闪烁?我注意到它甚至发生在文本中......
是否有解决方法?
最佳答案
这似乎是一个已知问题,它也发生在文本中:
https://code.google.com/p/android/issues/detail?id=180454
它将在下一版本的库中得到修复。
解决方法是暂时使用以前的版本:
com.android.support:design:22.2.0
编辑:这不是一个好的解决方法,因为在某些情况下图标可能会消失(我认为方向改变和滑动的组合)。
编辑:我认为它不会消失,但更像是将其颜色更改为我给它的选择器中不存在的其他颜色(只有 2 种状态:选中和默认)。
编辑:好的,找到了图标的解决方法。
使用我上面提到的旧版本 (22.2.0)。
您需要避免为图标使用选择器。请改用确切的图像资源 ID:
private static final int[] TAB_ICONS_UNSELECTED = {... }; private static final int[] TAB_ICONS_SELECTED = {... };
根据页面选择更新图标,例如:
mViewPager.addOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(final int position) { for (int i = 0; i < tabLayout.getTabCount(); ++i) tabLayout.getTabAt(i).setIcon(i != position ? TAB_ICONS_UNSELECTED[i] : TAB_ICONS_SELECTED[i]); } });
此外,请记住在初始化 TabLayout 时调用相同的循环。类似的东西:
for (int i = 0; i < tabLayout.getTabCount(); ++i)
tabLayout.getTabAt(i).setIcon(i != mViewPager.getCurrentItem() ? TAB_ICONS_UNSELECTED[i] : TAB_ICONS_SELECTED[i]);
我认为这也应该解决文本的问题,而不仅仅是图标。
编辑:v23 似乎会修复它,并且很快就会可用。
关于android - 为什么在页面之间滑动时 TabLayout 的选项卡图标/文本会闪烁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31828610/