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

原创,转载请注明:http://blog.csdn.net/fzh0803/archive/2011/06/21/6559081.aspx

    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;

你可能感兴趣的:(TabActivity,LocalActivityManager,TabHost,TabWidget深度分析(一))