TabHost理解与使用

Posted Mihai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TabHost理解与使用相关的知识,希望对你有一定的参考价值。

一.继承关系

java.lang.Object  
   ↳ 	android.view.View  
  	   ↳ 	android.view.ViewGroup  
  	  	   ↳ 	android.widget.FrameLayout  
  	  	  	   ↳ 	android.widget.TabHost

 

二.概述

TAB的容器。这个对象包含两个子元素:

  1. TabWidget:管理标签(tabs),用户点击来选择一个特定的标签,是它告诉TabHost去切换界面的
  2. FrameLayout:对象显示该页的内容

 

三.常用方法

  1. public void addTab(TabHost.TabSpec tabSpec)
  2. public void setup ():在addTab之前要先调用setup

四.三个内部类

  1. class:TabHost.TabSpec
  2. interface:TabHost.OnTabChangeLisetener
  3. interface:TabHost.TabContentFactory

TabHost.TabSpec

tab(标签)有一个indicator,content.例如:

tabHost.addTab(tabHost.newTabSpec("tab_time").setIndicator("时钟").setContent(R.id.tab_time));

1.indicator

有三个重载的方法可以设置标签的名字和图案。返回值都是TabHost.TabSpec

  1. setIndicator(CharSequence label)
  2. setIndicator(View view)
  3. setIndicator(CharSequence lable,Drawable icon)

2.content

返回值都是TabHost.TabSpe。是第一个比较常用。

  1. **setContent(int viewId)**传入视图的ID与之关联起来
  2. setContet(Intent intent)在TabHost.TabContentFactory创建的这个视图的内容
  3. setContent((TabHost.TabContentFactory contentFactory)

3.tag

这是相当于一个tag的身份证,在 new TabSpec(String tag)决定了

 

五.例子

http://www.cnblogs.com/Mihai/

 

六.源码大观

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方法

以上是关于TabHost理解与使用的主要内容,如果未能解决你的问题,请参考以下文章

Android 片段,在 TabHost 中找不到 id 的视图

带有 Fragments 和 FragmentActivity 的 TabHost

Android 在 Fragment 中添加选项卡

集成 tabhost 和导航抽屉

如何在android中为Fragment TabHost提供底部阴影?

Android 预加载 TabHost 视图