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:

import android.annotation
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值