Android之TabLayout常见问题解决+TabLayout+ViewPager实现标签页面联动
TabLayout一般不报错还没效果,那就先检查下面这几项是否使用了。。。
TabLayout使用:
首先导入依赖:implementation 'com.android.support:design:28.0.0'
设置模式:setTabMode(TabLayout.MODE_SCROLLABLE)或在控件设置;
关联:tabLayout.setupWithViewPager(pager);
适配器重写:getPageTitle(int position)方法
在大佬这借个效果图https://blog.****.net/Bu_siliang/article/details/80506070
- 下面是布局的写法:(注意tabMode设置模式?固定:滑动)
<android.support.design.widget.TabLayout
android:id="@+id/tabLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabMode="scrollable" />
<!--
一大堆子属性
app:tabIndicatorColor 指示器颜色
app:tabTextColor tab栏字体颜色
app:tabSelectedTextColor tab栏字体被选颜色
app:tabIndicatorHeight 指示器高度
app:tabBackground tab背景颜色
app:tabMaxWidth tab栏最大宽度
app:tabTextAppearance tab栏字体样式
app:tabMinWidth tab栏最小宽度
......
-->
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"/>
- 标签自定义模拟数据,我是根据标签的页数创建的Fragment,加载到ViewPager中
/**
* 先找控件
*/
//添加标题
String tabs = new String[]{"tab1,tab2,tab3,tab4,tab5,tab6"};
for (int i = 0; i < tabs.length; i++) {
//循环添加标签
tabLayout.addTab(tabLayout.newTab().setText(tabs[i]));
//循环创建fragment
fragments.add(ChildFragment.newInstance(i));
}
//适配器
MainPagerAdapter adapter = new MainPagerAdapter(getChildFragmentManager(), tabs, fragments);
pager.setAdapter(adapter);
//tablayout关联Viewpager
tabLayout.setupWithViewPager(pager);
- Fragment利用的事动态创建,需要创建静态工厂,最后放置viewpager,这个方法写在上面代码下面即可;
//静态工厂
public static MainFragment newInstance(int index) {
MainFragment mainFragment = new MainFragment();
Bundle args = new Bundle();
args.putInt("index", index);
mainFragment.setArguments(args);
return mainFragment;
}
Step:适配器写法:
在适配器里面就是集成FragmentPageAdapter,切记传入getSupportFragmentManager();因为我的是集成父类
Fragment所以要拿到他的子类,要自主重写 getPageTitle(int position)方法,不然不展示标题;
public class MainPagerAdapter extends FragmentPagerAdapter {
private String[] tabs;
private ArrayList<Fragment> fragments;
public MainPagerAdapter(FragmentManager childFragmentManager, String[] tabs, ArrayList<Fragment> fragments) {
super(childFragmentManager);
this.tabs = tabs;
this.fragments = fragments;
}
/**
* 获取每一个Fragment的页面
* @param i
* @return
*/
@Override
public Fragment getItem(int i) {
return fragments.get(i);
}
/**
* 标签数量-->也就是ViewPager内的Fragment页数
*
* @return
*/
@Override
public int getCount() {
return fragments.size();
}
/**
* 内置代码:获取每一个标签页--->赋值
*
* @param position
* @return
*/
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return tabs[position];
}
}