TabLayout
TabLayout: 属于Material Design库下的控件,在Android
开发中使用频率还是比较高的。
基本使用
1 | compile 'com.android.support:design:25.3.1' |
配合ViewPager使用
创建xml
文件,在文件中配置tabLayout
与viewPager
,官方文档的例子:1
2
3
4
5
6
7
8
9
10<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.TabLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top" />
</android.support.v4.view.ViewPager>
创建 fragment
与 FragmentPagerAdapter
适配器
1 | private class ReChargeAdapter extends FragmentStatePagerAdapter { |
AttachActivity
设置
1 | tabLayout.setupWithViewPager(viewPager); 设置与 viewPager 联动 |
几个基本属性
1 | tabSelectedTextColor 被选中 tab 的字体颜色 |
1 | tabIndicatorHeight 指示条的高度 |
1 | tabIndicatorColor 指示条的颜色 |
1 | tabMode fixed 即标题固定,scrollable 为标题滚动 |
1 | tabGravity fill 填充布局,center 居中显示 |
1 | tabBackground 标题背景 |
修改 TabLayout 指示条长度
TabLayout 没有现成的 Api
可以修改指示条的长度,实际项目中常常要求指示条与标题文字长度保持一致。网上有几种办法,只能基本满足,如果严格匹配需要借助第三方库。
stackoverflow
上有几种办法可以参考。自己在项目中是通过反射修改,只能粗略满足:
1 | private void setIndicatLength(TabLayout tab, int leftMargin, int rightMargin) { |
初始化时调用:1
2TabLayout tabLayout = findViewById(R.id.tab_layout);
setIndicatLength(tabLayout, 20, 20);
为什么是 “mTabStrip”
查看 TabLayout
的源码可以发现,mTabStrip
的本质是一个LinearLayout
,是个私有的变量,正是这个变量控制了 TabLayout
下指示条的长度与 tabItem
的LayoutParams
。而反射可以在运行时获得mTabStrip
变量,从而修改指示条长度。也就解释了反射中的:1
strip = tabLayout.getDeclaredField("mTabStrip");