具有 3 种不同颜色的 3 种状态 TabLayout

3 states TabLayout with 3 differents colors

我正在尝试使用基于我将以编程方式执行的 3 种状态的 3 种不同 TextColor 的 tabLayout,基本上这些状态将是 CURRENTSEENUNSEEN一切都是动态的。

问题是基本的 viewpager 和更准确的 tablayout 只允许 2 个状态,即 SELECTEDUNSELECTED。更不用说 setCustomView,将添加(创建)视图而不是设置(更新)值,我最终会堆叠视图...

我正在考虑覆盖 TabLayout class 或添加一些 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 来满足我的需要。