tablayout有问题,切换到第二个选项卡时,它将跳回第一个选项卡



我正在尝试为我的程序创建一个选项卡布局。有两个选项卡。如果我尝试切换到Tab2而不是停留在Tab2上,它会变回Tab1。我不知道是什么导致了这个问题。

这是我的代码

主要活动:

tabLayout = findViewById(R.id.tablayout);
viewPager2 = findViewById(R.id.viewpager);
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentAdapter = new CustomAdapter(fragmentManager, getLifecycle());
viewPager2.setAdapter(fragmentAdapter);
tabLayout.addTab(tabLayout.newTab().setText("Tab1"));
tabLayout.addTab(tabLayout.newTab().setText("Tab2"));
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager2.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageScrollStateChanged(int state) {
tabLayout.selectTab(tabLayout.getTabAt(state));
}
});

自定义适配器:

public class CustomAdapter extends FragmentStateAdapter {
public CustomAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) {
super(fragmentManager, lifecycle);
}
@NonNull
@Override
public Fragment createFragment(int position) {
if(position == 1) return new BlankFragment1();
return new BlankFragment2();
}
@Override
public int getItemCount() {
return 2;
}

根据这里的官方文档,您可以使用TabLayoutMediator链接选项卡布局和寻呼机,而不是使用自己的侦听器。

然而,您观察到的问题的根源是onPageScrollStateChanged中的state不是它滚动到的位置——它是一个表示滚动状态的整数。由于SCROLL_STATE_IDLE是0,而SCROLL_STATE_DRAGGING是1,所以一旦停止拖动,它就会跳回选项卡0。

使用TabLayoutMediator(推荐(

要使用TabLayoutMediator,请替换addOnTabSelectedListenerregisterOnPageChangeCallback,并用它手动设置选项卡(addTab(,它将选项卡链接到视图寻呼机,并提供设置选项卡标题的方法

// remove the "addTab" calls, "addOnTabSelectedListener", 
// and "registerOnPageChangeCallback"
new TabLayoutMediator(tabLayout, viewPager2,
(tab, position) -> tab.setText("Tab" + (position + 1))
).attach();

使用您自己的监听器

仍然可以使用自己的侦听器,但必须将视图寻呼机侦听器更改为使用onPageSelected而不是onPageScrollStateChanged,如下所示:

viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageSelected(int position) {
tabLayout.selectTab(tabLayout.getTabAt(position));
}
});

注意:位置是基于0的,所以您显示的是";BlankFragment2";在位置0和"0"处;BlankFragment1";在位置1(不确定这是否是你想要的(。

最新更新