一.继承关系
java.lang.Object
↳ android.view.View
↳ android.view.ViewGroup ↳ android.widget.FrameLayout ↳ android.widget.TabHost
二.概述
TAB的容器。这个对象包含两个子元素:
- TabWidget:管理标签(tabs),用户点击来选择一个特定的标签,是它告诉TabHost去切换界面的
- FrameLayout:对象显示该页的内容
三.常用方法
- public void addTab(TabHost.TabSpec tabSpec)
- public void setup ():在addTab之前要先调用setup
四.三个内部类
- class:TabHost.TabSpec
- interface:TabHost.OnTabChangeLisetener
- interface:TabHost.TabContentFactory
TabHost.TabSpec
tab(标签)有一个indicator,content.例如:
tabHost.addTab(tabHost.newTabSpec("tab_time").setIndicator("时钟").setContent(R.id.tab_time));
1.indicator
有三个重载的方法可以设置标签的名字和图案。返回值都是TabHost.TabSpec
- setIndicator(CharSequence label)
- setIndicator(View view)
- setIndicator(CharSequence lable,Drawable icon)
2.content
返回值都是TabHost.TabSpe。是第一个比较常用。
- **setContent(int viewId)**传入视图的ID与之关联起来
- setContet(Intent intent)在TabHost.TabContentFactory创建的这个视图的内容
- setContent((TabHost.TabContentFactory contentFactory)
3.tag
这是相当于一个tag的身份证,在 new TabSpec(String tag)决定了
五.例子
六.源码大观
public class TabHost...{ //常用属性 private TabWidget mTabWidget; private FrameLayout mTabContent; private List<TabSpec> mTabSpecs = new ArrayList<TabSpec>(2); private OnKeyListener mTabKeyListener; public void setup(){ //这里实例化TabWiget mTabWidget = (TabWidget) findViewById(com.android.internal.R.id.tabs); if (mTabWidget == null) { throw new RuntimeException( "Your TabHost must have a TabWidget whose id attribute is 'android.R.id.tabs'"); } .... mTabWidget.setTabSelectionListener(new TabWidget.OnTabSelectionChanged() { public void onTabSelectionChanged(int tabIndex, boolean clicked) { setCurrentTab(tabIndex); if (clicked) { mTabContent.requestFocus(View.FOCUS_FORWARD); } } }); mTabContent = (FrameLayout) findViewById(com.android.internal.R.id.tabcontent); if (mTabContent == null) { throw new RuntimeException( "Your TabHost must have a FrameLayout whose id attribute is " + "'android.R.id.tabcontent'"); } } }
注意:在自定义自己的TabHost的时候,Tabwiget和FrameLayout不可以自定义Id。为它需要在setup里面实例化,因此需要在addTab添加内容之前调用setup方法