我正在尝试为我的程序创建一个选项卡布局。有两个选项卡。如果我尝试切换到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,请替换addOnTabSelectedListener
、registerOnPageChangeCallback
,并用它手动设置选项卡(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(不确定这是否是你想要的(。