一、前言
在开发中,我们常常需要 ViewPager 结合 Fragment一起使用,来实现多页签的切换效果。在以前,我们有以下一系列第三方库来帮我们实现:
而现在,我们可以使用Design support library
库的 TabLayout
来实现了。
二、最终效果图
三、TabLayout 的使用
1. 添加依赖
由于 TabLayout 在 design 包内,所以首先需要在 app 目录下的 build.gradle
中添加以下依赖:
1 | dependencies { |
2. 创建布局
布局相当简单,只要添加 TabLayout 和 ViewPager 的布局即可:
1 | // layout/activity_main.xml |
还有其他的属性我习惯在style文件中设置:
1 | // values/styles.xml |
3. 创建 Fragment
1 | package com.sherlockshi.badgedtablayoutpractise; |
其中 Fragment 的布局:
1 | // layout/fragment_page.xml |
4. ViewPager 的适配器
1 | package com.sherlockshi.badgedtablayoutpractise; |
5. 设置 TabLayout
1 | package com.sherlockshi.badgedtablayoutpractise; |
四、设置角标
1. 添加角标 Badge
添加角标的关键代码只需要一行:
1 | mBadgeViews.get(i).setTargetView(((ViewGroup) mTabLayout.getChildAt(0)).getChildAt(i)); |
完整代码只需要在设置完 TabLayout 和 ViewPager 后,遍历每一个 Tab,为 Tab 添加角标:
1 | private void setUpTabBadge() { |
2. 更新角标
在需要更新角标的地方,只要调用以下方法就可实现:
1 | mBadgeCountList.set(1, count++); |
以上,就可以轻松地为 TabLayout 添加角标,并处理角标的更新了。
五、问题
1. 重复选中的状态
但是如果需要更新角标,那么在更新角标后
,再点击另一个 Tab,会出现上一个Tab
和当前Tab
都是选中状态(如下图的 Tab1 和 Tab2):
2. 角标位置不可控
而且如上图所示,角标的位置不好控制,有的离文字很近,有的离得很远,无法精确控制。
六、最实用的 TabLayout 加角标方法
1. 添加 getTabItemView() 方法
在重写的 FragmentPagerAdapter 中添加自定义 Tab 布局方法:
1 | public View getTabItemView(int position) { |
对应的自定义布局为:
1 | <?xml version="1.0" encoding="utf-8"?> |
2. 设置自定义布局
1 | private void setUpTabBadge() { |
上面的示例会有两个坑:
- 一个坑是每次为 TabLayout 添加 Badge 后,会出现 Tab 的字体颜色不是选中状态的颜色,需要手动设置 Tab 为选中状态,可以参考上面的第 19 行代码解决,这应该是 TabLayout 的一个 Bug;
- 另一个坑是如果每次更新 Badge 的时候,直接重新 tab.setCustomView 的话,会出现 Badge 不更新,解决办法是先移除之前的自定义布局,然后再重新设置布局,具体可参考第 6-12 行代码解决。
七、总结
以上是自己在使用 TabLayout 的过程中发现的一些问题及解决办法,如果大家有更好的解决方法,或者还有别的坑,欢迎留言。
当然,大家也可以直接使用第三方控件来实现以上功能,现在主流的几个控件也都做得很好,也很省心。
项目代码已共享到 Github:BadgedTabLayoutPractise
八、参考资料
Google Play Style Tabs using TabLayout
Android Tablayout tabs with notification badge like whatsApp
PS:欢迎关注 SherlockShi 个人博客