ViewPager滑动正常但手动点击TabLayout标签无响应该如何解决
问题原因
你目前仅配置了ViewPager滑动时同步TabLayout选中状态的单向关联,缺少点击Tab时同步切换ViewPager页面的逻辑,因此点击Signup标签无响应。无需单独给每个Tab设置onClickListener,按以下两种方案修改即可:
方案1:最小改动(无需修改Adapter)
仅需在LoginActivity的onCreate方法中补充TabLayout的选中监听,点击Tab时主动切换ViewPager页面:
public class LoginActivity extends AppCompatActivity { TabLayout tabLayout; ViewPager viewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); tabLayout = findViewById(R.id.tab_layout); viewPager = findViewById(R.id.view_pager); tabLayout.addTab(tabLayout.newTab().setText("Login")); tabLayout.addTab(tabLayout.newTab().setText("Signup")); tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); final LoginAdapter adapter = new LoginAdapter(getSupportFragmentManager(), this, tabLayout.getTabCount()); viewPager.setAdapter(adapter); viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); // 新增:点击Tab时同步切换ViewPager页面 tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { viewPager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(TabLayout.Tab tab) {} @Override public void onTabReselected(TabLayout.Tab tab) {} }); tabLayout.setTranslationY(300); } }
方案2:官方推荐双向绑定写法
使用TabLayout自带的setupWithViewPager方法自动实现滑动、点击的双向联动,后续扩展Tab时更规范,需要修改两处代码:
第一步:给LoginAdapter新增getPageTitle方法,返回每个Tab的显示文本
public class LoginAdapter extends FragmentPagerAdapter { private Context context; int totalTabs; public LoginAdapter(FragmentManager fa, Context context, int totalTabs) { super(fa); this.context = context; this.totalTabs = totalTabs; } @Override public int getCount() { return totalTabs; } public Fragment getItem(int position) { switch (position) { case 0: return new LoginTabFragment(); case 1: return new SignupTabFragment(); default: return null; } } // 新增:返回Tab的显示文本 @Override public CharSequence getPageTitle(int position) { switch (position) { case 0: return "Login"; case 1: return "Signup"; default: return ""; } } }
第二步:调整LoginActivity的初始化逻辑,删除手动加Tab和单向监听的代码,调用绑定方法
public class LoginActivity extends AppCompatActivity { TabLayout tabLayout; ViewPager viewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); tabLayout = findViewById(R.id.tab_layout); viewPager = findViewById(R.id.view_pager); // 删除手动添加Tab的代码,setupWithViewPager会自动创建Tab tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); final LoginAdapter adapter = new LoginAdapter(getSupportFragmentManager(), this, 2); viewPager.setAdapter(adapter); // 新增:双向绑定,自动处理滑动、点击联动,无需单独设置监听 tabLayout.setupWithViewPager(viewPager); tabLayout.setTranslationY(300); } }
内容的提问来源于stack exchange,提问作者Shubham Singh
相关产品推荐
相关产品推荐

