珍惜每一天

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

TabActivity,LocalActivityManager,TabHost,TabWidget深度分析(一)

 

 

    TabAcitivity 继承自AcitivtyGroup,AcitivityGroup的主要作用是创建一个LocalActivityManger,然后把activity 的onCreate等事件传递给LocalActivity来处理,作用仅此而已,非常简单。

TabActivity真正重要的包括三部分,TabHost,TabWidget,LocalActivityManager.

TabHost 主要是面向用户的接口,它的主要作用就是添加tab,用TabSpec来完成一个完整的tab的抽象(包括标签及其内容),一个string 类型的tag,这个tag用来标识一个tab,比如在退出程序时记录当前是哪个tab以便在再次进入的时候显示退出前显示的tab,它最重要的作用在于当 用intent做为一个tab,即要把一个activity作为内容(content)嵌入(即embeded activity的概念)进去,成为一个tab的内容。

另外一个在TabHost中比较重要的部分就是,它主要运用了策略模式来完成标签和内容的抽象。

创 建一个接口IndicatorStrategy,用一个方法createIndicatorView()来创建view(即在TabWidget上显示的 标签),根据传入的参数不同,有 LabelIndicatorStrategy,LabelAndIconIndicatorStrategy,ViewIndicatorStrategy 三种。从名称即可以看出标签可以为一个只含有String,也可以含有String和一张图片,或者用户自定义的view等三种形式。

用 接口ContentStrategy来抽象内容,有两个方法,getContentView()用来获取view,用tabClosed()来完成关闭的 操作(比如用户点击其他tab,关闭当前的tab),按照内容的不同有ViewIdContentStrategy(给定一个layout id作为内容),FactoryContentStrategy(用户实现继承TabContentFactory,用 createTabContent()来创建一个view作为内容),IntentContentStrategy(指定一个intent(即将一个 activity作为内容))三种方式。内容的rootView是一个framelayout,切换是通过让选择的内容visible,让原来的view invisible实现的。在刚开始点击标签时创建view,在后面的时候直接用。所以将actvity作为内容时,如果创建需要很长时间的话可能会觉得 迟钝(这里可能可以通过在创建tabhost的时候首先完成费时的操作这一办法减少迟钝感),而再后面切换的时候感觉很顺畅。

其中把activity内容是通过用LocalActvityManager来启动activity,并获取到一个window,再获取window的decorView来得到view,然后作为内容。代码如下:

final Window w = mLocalActivityManager.startActivity( mTag, mIntent);

            final View wd = w != null ? w.getDecorView() : null;

posted on 2013-02-19 22:55  了无痕  阅读(129)  评论(0)    收藏  举报