TabLayout切换异常:切换至Tab2后自动跳回Tab1求助
TabLayout切换至Tab2后自动跳回Tab1的问题修复
核心问题:ViewPager2滚动回调使用错误
你在viewPager2.registerOnPageChangeCallback中错误使用了onPageScrollStateChanged方法——这个方法的state参数是页面滚动状态值(如SCROLL_STATE_IDLE=0、SCROLL_STATE_DRAGGING=1),并非当前页面的索引位置。你用tabLayout.selectTab(tabLayout.getTabAt(state))会在滚动状态变为空闲(state=0)时,强制选中第0个Tab(Tab1),这就是切换后自动跳回的根本原因。
修复代码:
viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { @Override public void onPageSelected(int position) { // 当页面选中时,同步切换对应Tab tabLayout.selectTab(tabLayout.getTabAt(position)); } @Override public void onPageScrollStateChanged(int state) { // 保留空实现或按需处理,不要用state做页面索引 } });
可选优化:修正Fragment映射逻辑
你的CustomAdapter中createFragment的位置判断逻辑和常规映射相反(position=1对应BlankFragment1),虽然不影响当前跳转问题,但会增加后续维护混淆风险,建议调整为:
@NonNull @Override public Fragment createFragment(int position) { if(position == 0) { return new BlankFragment2(); // 对应Tab1 } else { return new BlankFragment1(); // 对应Tab2 } }
更简洁的联动方式(推荐)
可以使用官方提供的TabLayoutMediator替代手动编写两个监听,自动完成TabLayout和ViewPager2的联动,代码更简洁不易出错:
// 移除原有的tabLayout.addOnTabSelectedListener和viewPager2.registerOnPageChangeCallback代码 new TabLayoutMediator(tabLayout, viewPager2, (tab, position) -> { tab.setText(position == 0 ? "Tab1" : "Tab2"); }).attach();
内容的提问来源于stack exchange,提问作者missedSemicolon
相关产品推荐
相关产品推荐

