项目需求 - 使用TabLayout

材料设计是 google 官方在 2014 年谷歌大会上提出的界面设计规范,力求通过对光效、表面质感、运动感的控制,来提升安卓界面交互体验。

虽然 Material Design 已经推出了三年,但是实际应用上,Toolbar 和 TabLayout 是使用最广泛的。由于需求,这段时间特意提取了 TabLayout 的代码,对于许多只需要 Tablayout 的需求,其实不需要把整个 Design 包导入,还能减小体积。

链接:GitHub_ATabLayout


一、起因

项目现在用的是 HorizontalScrollView + ImageButton + ListView 的方式展示数据,根据点击来决定 ListView 显示的数据。但是由于代码陈旧,里面的弱标志又太多,所以希望能重构一下代码,让它的可读性更高一些,顺便优化一下交互。

二、起步

有了需求,需要先写个 demo 填坑。去年的时候 TabLayout + ViewPager + PtrListView 显示数据我是做过的,因此没有什么难度。但是到了工程里还是有了一些问题。这里记录一下。

三、问题

  • 1.使用 TabLayout 一直有资源不能找到,或者编译后就报错( 有点尴尬,复现不出来了 )

需要使用向后兼容的 AppCompatTheme 和 AppCompatActivity。如果工程的 BaseActivity 是 Activity 的子类,BaseTheme 也不是 AppCompatTheme 的子类,并且因为一些特殊的原因不能改动的话,可以在清单文件中注册页面时,在 TabActivity 下添加一条属性:android:theme="@style/Theme.AppCompat.Light.NoActionBar"

  • 2.自定义 TabLayout 中的 TabView 时,CusView 中的 ImageView 在第一次进入页面的时候,不会变为 select 状态

项目里我查看了 22.0.2 版本的源码,发现在 TabLayout.setSelectedTabView() 中并没有对 CusView 做 select 状态的修改。换一种方式,如果直接放入 Icon,发现除了第一次进入,后面的部分都是有正常的状态改变的。然而修改选中状态的方法的权限却不是公有,只能通过反射获取。或者,你可以通过 viewpager.setCurrentItem(1),viewpager.setCurrentItem(0),来达到目的。反正我是这么做的。= =

  • 3.项目中需要 TabLayout 的 indicator比 TabView 短一些

不同版本的 Design 包,对于 SlidingTabStrip 的绘制方法不同,主要看当前版本下 SlidingTabStrip.setIndicatorPosition 和 SlidingTabStrip.onDraw 方法。onDraw 方法在 25.3.1 不知道为什么改名成 draw 方法了。如果需要修改这个效果请关注上面两个方法中对应 left 和 right 的值。如果是使用 25.3.1 的版本,不妨使用我上面的链接,属性等等都已经修改好了。

四、使用

Design 包的更新速度还算可以,但是每个包总是会改动一些方法的实现,起码 22.0.1 和 25.3.1 差别还是有的,在网络上,许许多多的使用教程都还是 2014 2015 年的教程,尝试了一下,许多方法的参数已经不同了,也有的权限变更,有的方法干脆就被干掉了,完全找不到存在过的痕迹,因此这里简单写一下 25.3.1 的使用。

1. 简单使用 TabLayout + ViewPager +Fragment

布局:

LinearLayout - vertical
==>TabLayout - main_tablayoutId
==>ViewPager - main_viewpagerId

MainActivity:

// find view
mTabLayout = ((TabLayout) findViewById(R.id.main_tablayoutId));
mViewPager = ((ViewPager) findViewById(R.id.main_viewpagerId));

// init data
final String[] titles = {"111","222","333","444","555"};// tab title
final List<Fragment> fragments = new ArrayList();// tab fragment
for (int i = 0; i < 5; i++) {
    fragments.add(new BlankFragment());
}

// 设置 viewpager 适配器
mViewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
    @Override
    public Fragment getItem(int position) {// 获取 tab 对应的 fragment
        return fragments.get(position);
    }

    @Override
    public int getCount() {
        return fragments.size();
    }

    @Override
    public CharSequence getPageTitle(int position) {// 获取 tab 对应的 title
        return titles[position];
    }
});

mTabLayout.setTabGravity(TabLayout.GRAVITY_FILL);// 设置排列模式 (充满 - 居中)
mTabLayout.setTabMode(TabLayout.MODE_FIXED);// 设置滚动模式 (固定 - 滚动)
mTabLayout.setupWithViewPager(mViewPager);// 需要在 viewpager 设置适配器之后
2.TabLayout 属性介绍
// 常用
// 指示器
tabIndicatorHeight
tabIndicatorColor
// 文字 - 在没有设置 CustomView 的时候有效
tabTextColor
tabSelectedTextColor
// 背景
tabBackground
// 模式
tabMode
tabGravity

// tabview 的 padding 值比较大时会填掉 tabview 的内容布局,tablayout 的高度并不会变化(内部有一个 defaultHeight 值,决定了 tablayout 的高度)
tabPadding
tabPaddingStart
tabPaddingTop
tabPaddingEnd
tabPaddingBottom

// text 的样式
tabTextAppearance
// 第一个 tab 距离左边的偏移距离
tabContentStart
// tab 最小宽度
tabMinWidth

五、关于自定义 TabView

链接:Android Design Support Library系列之一:TabLayout的使用
上面的文章我觉得写得总结得很到位了,我就不再班门弄斧。但是文章最后写的关于 indicator 宽度的设置部分提到了一个方法 setIndicator(tablayout, marginLeft, marginRight) ,这个方法在我现在使用的 25.3.1 版本中并没有,所以才做了上面的提取操作。有可能还会有其他方法的不同,各位看官望知悉。


谢谢观赏
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,382评论 25 707
  • 通常在ViewPager的上方,我们都会放一个标签指示器与ViewPager进行联动。以前,我们大多使用的是Git...
    DoAndKeep阅读 79,578评论 36 110
  • 刚脑海中突然浮现出小时候家旁边雨后的田埂上一群鸭子在觅食的情景,那是二十年前的事,觉得怎么那么遥远,好像上辈子的事...
    木木日记2020阅读 116评论 0 0
  • 在这个极速发展的时代,有数据分析:现代人每天不停刷手机的时间约12小时。可是,你有没有觉得看了那么多东西却什么也记...
    tatablue阅读 607评论 0 1
  • 哈哈,沉寂了好久都没有发文章,就发发绘画的教程吧。说起来也很久没有share画作了,那就拿出最近画的猫咪来弄个教程...
    KellyGor阅读 1,937评论 9 24