刚用到TabActivity,查了很多资料,总结一下。
1、TabActivity存在必要性以及google当时的困扰
a. 首先我们要明白一点,android系统是单窗口系统,不像windows是多窗口的(比如在windows系统上,我们可以一边聊QQ,一边斗地主等等)。也就是说,在一个时刻,android里面只有一个activity可以显示给用户。这样就大大降低了操作系统设计的复杂性(包括事件派发等等).
b. 但是像TabActivity那种效果又非常必要,用户体验也比较好。所以我觉得当时google开发人员肯定很纠结。 于是,一个畸形的想法产生了,就是在单窗口系统下加载多个activity,它就是TabActivity。
tab组件一般包括TabHost和TabWidget、FrameLayout,且TabWidget、FrameLayout属于TabHost。
2、TabActivity
首先Android里面有个名为TabActivity来给我们方便使用。其中有以下可以关注的函数:
public TabHost getTabHost () 获得当前TabActivity的TabHost
public TabWidget getTabWidget () 获得当前TabActivity 的TabWidget
public void setDefaultTab (String tag) 这两个函数很易懂, 就是设置默认的Tab
public void setDefaultTab (int index) 通过tab名——tag或者index(从0开始)
3、TabHost
那么我们要用到的Tab载体是TabHost,需要从TabActivity.getTabHost获取。
现在看看TabHost类,它有3个内嵌类:1个类
TabHost.TabSpec,2个接口
TabHost.TabContentFactory和
TabHost.OnTabChangeListener。后面会介绍这些类和接口。
TabHost类的一些函数:
public void addTab (TabHost.TabSpec tabSpec) 添加 tab,参数TabHost.TabSpec通过下面的函数返回得到
4、TabHost.TabSpec
从上面的函数可以知道如何添加tab了,要注意,这里的Tag(标签),不是Tab按钮上的文字。
而要设置tab的label和content,需要设置TabHost.TabSpec类。 引用SDK里面的话——“A tab has a tab indicator, content, and a tag that is used to keep track of it.”,TabHost.TabSpec就是管理这3个东西:
public String getTag ()
public TabHost.TabSpec setContent
public TabHost.TabSpec setIndicator
我理解这里的
Indicator 就是Tab上的label,它可以
设置label :
setIndicator (CharSequence label)
或者同时
设置label和icon :
setIndicator (CharSequence label, Drawable icon)
或者直接
指定某个view :
setIndicator (View view)
对于
Content ,就是Tab里面的内容,可以
设置View的id :
setContent(int viewId)
或者
TabHost.TabContentFactory 的createTabContent(String tag)来处理:
setContent(TabHost.TabContentFactory contentFactory)
或者用
new Intent 来引入其他Activity的内容:
setContent(Intent intent)
TabHost控件(id="@android:id/tabhost")->TabWidget(必须命名为tabs)->FrameLayout(必须命名为tabcontent)。