我试图有一个tabLayout与3个不同的TextColor基于3个状态,我将做编程,基本上状态将是CURRENT
,SEEN
,UNSEEN
和一切都是动态的。
问题是基本viewpager和更精确的tablayout只允许2种状态,即SELECTED
和UNSELECTED
。更不用说setCustomView,将添加(创建)视图而不是设置(更新)值,我最终堆叠视图…
我正在考虑重写TabLayout类或添加一些kotlin扩展,但不知道从哪里开始。
如果你们能指出一些方向,我将不胜感激!
提前感谢。
多亏了@Akaki给我指明了正确的方向:
首先创建了一个方法来改变tabTextColor:
private fun changeTabTextColor(tabLayout: TabLayout?, index: Int, mainColor: Boolean) {
if (index in 0 until maxPosition) {
val tab = tabLayout?.getTabAt(index)
val sb = SpannableString(tab?.text)
val color =
if (mainColor) ContextCompat.getColor(ctx, R.color.main_text_color)
else ContextCompat.getColor(ctx, R.color.secondary_text_color)
sb.setSpan(ForegroundColorSpan(color), 0, sb.length, 0)
tab?.text = sb
}
}
我在这里处理2种颜色,但如果需要,可以添加更多。
第二个关键部分是设置文本会破坏动画,所以我们需要在ViewPager中自己处理它:
binding.viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
override fun onPageScrollStateChanged(state: Int) {}
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
tabLayout?.setScrollPosition(position, positionOffset, false)
}
override fun onPageSelected(position: Int) {}
})
这样动画将保持不变。
然后我玩了onTabSelected
,并调用changeTabTextColor
方法来满足我的需要。