現役プログラマのプログラミング教室@岡崎市康生町一隆堂ビル, Android/iOS(Swift/Kotlin)のアプリ開発、デジタル漫画制作を主軸事業としています。

APIレベルが低いとmaterial.tabs.TabLayoutのaddOnTabSelectedListenerでテキストサイズが変わらなかった。with Kotlin

詳細未調査ですが、こうしたら変わりましたというお話です。

まぁある意味当たり前なのかもですが、APIレベルが高い場合は全くもって問題なかったのですが

API22でネットで記載されていた方法にて、TabLayoutのテキストサイズを変更しみたのですが

何やっても変わらない><

SpannableStringでなくViewGroupからTextViewを取り出す方法など本当にいろいろ試したんですがうまくいかず、、、

最後のさいごでうまくいったのが、TabLayoutのカスタムクラスを作成した方法。

iOSほどandroidに馴染みがないのであれですが、推測としてはapp側のテーマによる制限など、別の仕組みが優先されてたのかなと勝手に解釈

Androidマスターの方のご意見聞きたいです。

APIレベル22でも動いたのはこちら。CustomTabLayoutです。

class CustomTabLayout : TabLayout {
    constructor(context: Context) : super(context) {
        init(context, null)
    }

    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
        init(context, attrs)
    }

    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
        init(context, attrs)
    }

    private fun init(context: Context, attrs: AttributeSet?) {
        this.addOnTabSelectedListener(object: OnTabSelectedListener {
            private val normal = AbsoluteSizeSpan(context.resources.getInteger(R.integer.tab_font_small), true)
            private val large = AbsoluteSizeSpan(context.resources.getInteger(R.integer.tab_font_large), true)
            override fun onTabSelected(tab: TabLayout.Tab) {
                tab?.also {
                    it.text?.also { text ->
                        val spanText = if(text is SpannableString) text else SpannableString(text)
                        spanText.removeSpan(normal)
                        spanText.setSpan(
                            large,
                            0,
                            text.length,
                            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
                        )
                        it.text = spanText
                    }
                }
            }

            override fun onTabUnselected(tab: Tab) {
                tab?.also {
                    it.text?.also { text ->
                        val spanText = if (text is SpannableString) text else SpannableString(text)
                        spanText.removeSpan(large)
                        spanText.setSpan(
                            normal,
                            0,
                            text.length,
                            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
                        )
                        it.text = spanText
                    }
                }
            }

            override fun onTabReselected(tab: Tab) {}
        })
    }
}