android实现ViewPage效果的TabActivity

都知道不同页面的切换可以用TabActivity或者ViewPage来实现。
   
    TabActivity可以实现不同模块的切换并使各个模块保持编码、生命周期和内存的相对独立,但是要想实现ViewPage那种能滑动并能拖动同时显示两个Tab页内容的效果就麻烦了,一般都是注册个手势监听实现基本的左右滑动,并不能拖动。
   
    ViewPage达到了这种显示效果,但是它的默认是在一个Activity做不同的View切换,也就是说假如我们有10个页面要处理,那么我们10个页面的代码和逻辑都要耦合在一个Activity里,每个页面要是简单还好,要是都很复杂那就麻烦了,代码的可读性和可维护性就很差了,团队配合也不方便,当然通过良好的代码分层肯定还是能在代码和设计层面上解耦,但是内存还是共享的,每个模块的独立性也很难做到清晰。
   
    那么我们怎么实现这种既具有TabActivity特性又具有ViewPage的那种流畅效果的容器呢,那就是两手都要抓、两手都要硬,将二者相结合起来用。有了这种想法之后我干的第一件事就是Google,看看有没有同学实现了,有现成的不用多浪费。搜了半天确实找个了几篇文章和我要的东西很接近,是通过将TabActivity和ViewPage相结合做的,原理是将原来的TabHost的View文件中的FrameLayout隐藏掉,取而代之的是显示一个ViewPage,在代码里动态的把原来声明在TabHost里的每个Intent在ViewPage里添加一遍,当ViewPage的page切换后代码将TabHost的当前Tab设成当页的内容就行了,一开始我觉得靠谱,便直接把网上的代码在我的项目里实现了(这个代码大家在网上都能搜到,我这里就不提供了),效果确实实现了,但是,当我滑动到第二页时发现了不能容忍的问题……
 
    在我的代码逻辑里,在我切到第二页之前我给第二页的Intent设置了一些参数,这样可以在第二页的Activity中通过onNewIntent或onResume方法中获取这些参数,并根据这些参数做一些页面上的处理(TabActivity切换时会发一个新的Intent到这个页面,而TabActivity把其子容器中的Activity都设置成SingleTop了,所以每次切换页面都成触发目标Activity的onNewIntent和onResume方法),原来我的程序在TabActivity运行时没用问题的,现在换成了TabActivity+ViewPage的实现发现当我切换到第二页的时候任何效果都没有,程序平静的和,水一样,看了下日志却发现第二页里的onNewIntent和onResume都执行了,这不坑爹吗,执行了还没反应,再仔细查日志发现了第二页的OnCreate方法执行了两次,我这才明白是怎么回事。原来,用网上这种方法使我每页的Activity都被创建了2次,一个是放到了ViewPage里,一个是放到了TabHost里,而我每次操作的都是TabHost的对象,显示的却是ViewPage里的对象,当然没反应了。这种无谓的创建两次的方法是我不能接受的,仔细研究代码,我发现按照这个逻辑,TabHost的存在完全是多余的,所以就有了我通过TabActivity的父类ActivityGroup结合ViewPage来实现该容易的想法。
   
    基本的功能我都封装好了,用的时候直接继承我写的这个类就好了,要实现更复杂的功能和效果可以再继承一层或者直接改父类就行,想怎么发挥就怎么发挥,我这里只提供核心的功能,别的功能暂时我项目里还用不到,就没封装了。先看怎么用吧:
………………
 
原文请看:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值