背景
假设二级页面是上面图片的布局,当进来时TabLayout和ViewPager2绑定完就马上调setCustomItem,跳转到最后一个tab页面时,会发现tab不滚动,手动滑一下ViewPager2时才会滚动tab到正确的位置
原因分析
- 调用TabLayoutMediator.attach时,会调用TabLayout.setScrollPosition
- TabLayout.setScrollPosition就是用来滚动tab的
通过断点发现scrollTo传入了0,造成tab不滚动,而position不为0,所以是scrollXForPosition为0导致的 - calculateScrollXForTab方法是计算tab滚动的距离
通过断点发现是因为selectedChild.getLeft()和selectedWidth都返回了0,因为abLayout和ViewPager2绑定完就马上调setCustomItem,这时候TabLayout还没有完成布局测量操作,所以tab的位置这些信息还拿不到。
解决方法
post一个Runnable再执行setCurrentItem,这时候tab已经完成测量,能拿到宽度,左边距等信息
binding.tabLayout.post {
binding.viewPager.setCurrentItem(index, false)
}