我长时间使用PagerSlidingTabStrip库,在ViewPager上方显示标签。
最近,我的任务是设置图标(使用选择器,选择与未选择状态)而不是选项卡的文本,所以我做了。但是,似乎图书馆无法很好地处理它,有时会显示空白标签,所以我已移至TabLayout,这是Google设计库的一部分
我注意到了一些如何向TabLayout添加图标的解决方案,但每个解决方案都有一个或多个问题:
我使用的代码来自MainActivity.java文件中的cheesesquare示例。这很基本:
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所示。这对我来说根本没有显示图标。
我记得我也尝试了其他解决方案,但他们也遇到了我提到的问题。
为标签设置图标的正确方法是什么?
有没有官方的方法来实现这一目标?我希望每个标签至少有一个选定的和未选择的图像。选择时的过渡是一个很好的奖励,我希望通过这种方式看起来更好。
为什么图标会闪烁?我注意到它甚至出现在文本中......
可能有解决方法吗?
答案 0 :(得分:8)
这似乎是一个已知问题,它也适用于文本:
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会将其修复,并且很快就会推出。