一般做tab式界面我都是用的BottomNavigationView+Fragment,自己代码控制各fragment的显示和隐藏,这样做代码要多些,如果控制不当可能会在用户重返app时出现fragment重合现象。那偷懒一些的做法可以使用FragmentTabHost+Fragment来实现,只用添加相应Tab就可以,方便很多。
先看实现的效果:
布局文件
|
|
这里注意FragmentTabHost和它的孩子FrameLayout必须使用android内部id,虽然使用上面container的FrameLayout容纳fragment但FragmentTabHost内的FrameLayout也不能省
代码中初始化
|
|
- Tab是简单封装每个tab的信息,包括图标、文字、对应的fragment类。
- 接下来要调用FragmentTabHost的setup方法,传入FragmentManager和容纳fragment的FrameLayout的id,这样它才能管理这些碎片。
- addTab时,第一个参数为TabSpec(传入的tag要唯一),并为它设置indicator。
- tabhost默认会在每个tab中间显示分隔线,不想要的话用
tabhost.getTabWidget().setDividerDrawable(null); 去掉 - 最后默认在第一个位置
图标及文字的selector
为了让tab选择和未选择下有不同效果,要使用到selector
icon的selector
文字颜色的selector(注意要放在color目录下,作为color资源,直接指定给textColor属性)
indicator布局
|
|
重用view
上面这些代码后就能实现想要的效果,但是会发现每次选中某个fragment都会重新调用它的onCreateView方法,也就是说view不能重用,这里可以在fragment中加入几行代码缓存view,避免每次都要重建view
BaseFragment.class