TabLayout设置Tab宽度和指示条宽度

设置Tab宽度

参考自此文章
不过我使用customView时发现需要把原文中的

width = mTextView.getWidth();  

去掉
修改后的方法如下(Kotlin):

/**
 * 设置TabLayout的Tab宽度为某个view的宽度
 */
fun TabLayout.setTabWidthBy(fieldName: String) {
    //了解源码得知 线的宽度是根据 tabView的宽度来设置的
    post {
        try {
            //拿到tabLayout的mTabStrip属性
            val mTabStripField = javaClass.getDeclaredField("mTabStrip")
            mTabStripField.setAccessible(true)

            val mTabStrip = mTabStripField.get(this) as LinearLayout

            val dp10 = dip2px(context, 10f)

            for (i in 0 until mTabStrip.childCount) {
                val tabView = mTabStrip.getChildAt(i)

                //拿到tabView的mView属性
                val mViewField = tabView.javaClass.getDeclaredField(fieldName)
                mViewField.isAccessible = true

                val mView = mViewField.get(tabView) as View

                tabView.setPadding(0, 0, 0, 0)

                //因为我想要的效果是   字多宽线就多宽,所以测量mView的宽度
                mView.measure(0, 0)
                var width = mView.measuredWidth
                //设置tab左右间距为10dp  注意这里不能使用Padding 因为源码中线的宽度是根据 tabView的宽度来设置的
                val params = tabView.layoutParams as LinearLayout.LayoutParams
                params.width = width
                params.leftMargin = dp10
                params.rightMargin = dp10
                tabView.layoutParams = params

                tabView.invalidate()
            }

        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

设置指示条宽度

安卓SDK原生Tablayout的指示条宽度和Tab的宽度一样,不支持修改(看了源码)。如果非要修改,可以使用其他替代库;
或者。。使个trick,把指示条放到Tab的customView的布局里,设置成selector类型的drawable就行了。

这个trick也是因为试了一些方案后觉得不合适才想到的~

你可能感兴趣的:(TabLayout设置Tab宽度和指示条宽度)