TabLayout和FragmentViewPager经常结合使用,用法比较简单,只需要用setupWithViewPager
方法把两者关联起来就可以了。但在使用过程中遇到了以下几个问题。
1. tabLayout不显示名字
for (int i = 0; i < 3; i++) {
TabLayout.Tab tab = tabLayout.newTab();
tab.setText(titleName[i]); // String数组里面存放的是几个tab的名字
tabLayout.addTab(tab);
}
List<Fragment> list = new ArrayList<Fragment>();
list.add(new HomeRecommendFragment());
list.add(new HomeRecommendFragment());
list.add(new HomeRecommendFragment());
viewPager.setAdapter(new MainPageFragmentAdapter(getFragmentManager(), list));
tabLayout.setupWithViewPager(viewPager);
结果几个名字都没有显示出来
查看android官方文档TabLayout,有如下解释:
可见,在setupWithViewPager之后,tablayout会使用每个pageAdapter里的page title,而起初我并没有设置。
所以设置一下就可以了
public class MainPageFragmentAdapter extends FragmentPagerAdapter {
List<Fragment> list;
String[] titles;
public MainPageFragmentAdapter(android.support.v4.app.FragmentManager fm, List<Fragment> list, String[] titles) {
super(fm);
this.list = list;
this.titles = titles; // 把tab名字通过数组传进来
}
@Override
public Fragment getItem(int position) {
return list.get(position);
}
@Override
public int getCount() {
return list.size();
}
@Override
public CharSequence getPageTitle(int position) {
return titles[position]; // 在这里返回每个tab的名字
}
}
2. 点击tab之后,ViewPager不滑动
给TabLayout定义了自己的onTabSelectedListener之后,再点击一个tab,ViewPager并没有跟着滑动
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
Log.i(TAG, "");
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
这其实是因为TabLayout已经有默认的OnTabSelectedListener了,就是ViewPagerOnTabSelectedListener,查看源码,定义如下:
/**
* A {@link TabLayout.OnTabSelectedListener} class which contains the necessary calls back
* to the provided {@link ViewPager} so that the tab position is kept in sync.
*/
public static class ViewPagerOnTabSelectedListener implements TabLayout.OnTabSelectedListener {
private final ViewPager mViewPager;
public ViewPagerOnTabSelectedListener(ViewPager viewPager) {
mViewPager = viewPager;
}
@Override
public void onTabSelected(TabLayout.Tab tab) {
mViewPager.setCurrentItem(tab.getPosition()); // 关键代码
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
// No-op
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
// No-op
}
}
关键的代码就是在onTabselected
方法里面调用了viewPager的setCurrentItem
所以要想自定义OnTabSelectedListener,也加上
mViewPager.setCurrentItem(tab.getPosition())
就可以了
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
Log.i(TAG, "");
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});