Android博客挑错系列之一FragmentTabHost和ViewPager实现底部导

决定写这个系列,是因为大部分的国内博客都是拿来主义——照搬,一点也不考察博客内容的正确性,

希望这个系列能对国内的这种风气起到一点作用。

首先就拿一个常见的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:

其中将OnTabSelectionChanged这个interface设置为public,

这样实现MartianTabWidget的tab点击响应事件就可以简单的调用setTabSelectionListener来实现了~

大家如有问题可留言讨论哈~

该方法已经在我们的小说阅读软件淘小说中实现,

大家多多支持哈~后续会有更多干货出来哦~

,如果心在远方,只需勇敢前行,梦想自会引路,

Android博客挑错系列之一FragmentTabHost和ViewPager实现底部导

相关文章:

你感兴趣的文章:

标签云: