决定写这个系列,是因为大部分的国内博客都是拿来主义——照搬,一点也不考察博客内容的正确性,
希望这个系列能对国内的这种风气起到一点作用。
首先就拿一个常见的FragmentTabHost和ViewPager实现手势切换底部工具栏来开开刀吧
一个实现普遍的实现如博客使用FragmentTabHost和ViewPager实现仿微信主界面侧滑 (无意冒犯,Google搜索的排名靠前,如需删除请告知)
这种实现方法确实能够实现底部工具栏的切换,但是却增加了一倍Fragment的数量。
文中调用FragmentTabHost的addTab将fragmentArray中Fragments加入FragmentTabHost中,
(注:fragment是以class的形式传入,在FragmentTabHost的内部会将这些fragment的类实例化)
而在initPager函数中又新建了一遍所有的fragment,并加入到ViewPager中。
因此文中存在8个fragment的实例,而这个界面往往是放在应用启动后的第一个界面,这种资源的浪费是很严重的。
那么如何解决呢?
一种方法是自己写一个底部的工具栏,然后配合ViewPager进行Tab的切换。
虽然方法简单,但略显繁琐,有点重复造轮子的感脚。
另外一种方法是重用FragmentTabHost中的TabWidget类,具体的xml代码如下:
TabWidget的具体用法资料比较少,可直接看其源代码TabWidget.java
简单说下,通过TabWidget.addView()来加入Tab的图标,
通过TabWidget.setCurrentTab()来设置当前focus在哪个tab上。
但是这种方法存在两个问题,一个是Tab的点击响应实现不方便,一个是2.3及以下的系统不兼容。
可以看到源码中OnTabSelectionChanged并不是public,因此只有和TabWidget在一个package中的才能访问这个interface。
而不兼容问题导致在应用中TabWidget显示成一个白条。。。
因此小星最后的解决方法是实现自己的一个TabWidget,但并不是完全自己写,而是有选择的拷贝TabWidget里的代码。
最终修改后的TabWidget的源码如下,小星将其命名为MartianTabWidget:
import android.annotation