如何设置TabLayout的捕捉行为

时间:2018-10-06 12:49:00

标签: android android-fragments android-viewpager android-tablayout

我正在使用TabLayout显示不同标签页的图标和名称。使用TabLayout时,我使用ViewPager在每个标签上添加Fragments。带有可点击标签的TabLayout(它们位于点击中间的中间位置)正在工作,但是我想实现与RecyclerView SnapHelper相同的功能。如果我滚动TabLayout选项卡,它将把视图捕捉到屏幕中央并将其选中。这应该在Fragment下显示TabLayout

有什么办法吗?

这是我自定义的TabLayout,它将单击的视图居中居中。

class CenteredTabLayout : TabLayout {
    constructor(context: Context) : super(context) {}

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

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

    override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
        super.onLayout(changed, l, t, r, b)
        val firstTab = (getChildAt(0) as ViewGroup).getChildAt(0)
        val lastTab = (getChildAt(0) as ViewGroup).getChildAt((getChildAt(0) as ViewGroup).childCount - 1)
        if (firstTab != null && lastTab != null){
            ViewCompat.setPaddingRelative(getChildAt(0), width / 2 - firstTab.width / 2, 0, width / 2 - lastTab.width / 2, 0)
        }
    }
}

1 个答案:

答案 0 :(得分:0)

TabLayout selected tab gravity

tl; dr使用默认的TabLayout,您不能修改捕捉效果。因为计算其移动calculateScrollXForTab的距离的方法是私有的,因此无法替代。

我也想对TabLayout进行一些自定义捕捉。最终我放弃了,并为选项卡创建了自己的RecyclerView和适配器。我不需要由TabLayout提供的指示符(创建了我的自定义指示符)。因此,我要做的就是使用适配器实现ViewPager.OnPageChangeListener

还请阅读滚动如何真正帮助了我其他源代码。

例如https://github.com/nshmura/RecyclerTabLayout