Android控件-TabHost(一)
阅读原文时间:2023年07月10日阅读:2

什么是TabHost?

TabHost组件的主要功能是可以进行应用程序分类管理,例如:在用户使用windows操作系统的时候,经常见到如图所示的图形界面。

TabHost选项卡,说到这个组件,不得不先说一件事情,翻翻谷歌提供给我们的API,我们可以发现这样的一段话:

它告诉我们,这个组件在安卓4.0之后已经被废弃了,建议我们新的程序应该使用Fragment组件来代替它。

其实并不出乎意料,使用过TabHost的朋友应该都知道:

1、它的设计违反了Activity单一窗口原则,它可以同时加载多个Activity,然后再它们之间进行来回切换。

2、有个很致命的问题就是当我们点击别的选项时,按下Back后退键,它会使整个应用程序都退出,而不是切换到前一个选项卡,虽然我们可以在主程序里覆写OnKeyDown这个方法,但这样就会导致每一次按下Back后退键都只能回到第一个选项菜单。

但作为开发者,这个具有历史里程碑的组件,我们还是需要去掌握下,下面给几张图来看下今天要实现的效果:

  

下面附上代码(注释很详细)

实现TabHost有两种方式:

方式一:直接让一个Activity程序继承TabActivity类(通过getTabHost取得实例);

方式二:定义XML布局文件利用findViewById()方法取得TagHost组件,通过setup()方法实例化并进行若干配置;

下面讲解以第二种方式为例,先看下项目结构:

1、TabHost主布局文件

activity_main.xml(为了使选项卡显示在屏幕下方,这里采用了相对布局)

<!-- 需要一个布局管理器 -->

<RelativeLayout  
    android:layout\_width="fill\_parent"  
    android:layout\_height="fill\_parent"  
    >

            <!--  
   由于TabHost是继承于FrameLayout,所以需要一个FrameLaytout布局(内容页) ,id  
   必须为tabcontent  
    -->

    <FrameLayout  
        android:id="@android:id/tabcontent"  
        android:layout\_width="fill\_parent"  
        android:layout\_height="fill\_parent"  
        >  
    </FrameLayout>

    <!-- TabWidget必须标签,用来存放tab标签,且id必须为tabs -->

    <TabWidget  
        android:id="@android:id/tabs"  
        android:layout\_width="fill\_parent"  
        android:layout\_height="wrap\_content"  
        android:background="@drawable/tab\_widget\_background"  
        android:layout\_alignParentBottom="true"  
        >  
    </TabWidget>

</RelativeLayout>

TabHost的布局的文件必须遵循下面几点:

1、所有的用于标签配置的文件,必须以“”为根节点;

2、为了保证标签页和标签内容显示正常(例如:标签提示要放在标签显示内容之上)则可以采用一个布局管理器进行布局(例如:LinearLayout,RelativeLayout..)

3、定义一个“”的标签,用于表示整个标签容器,另外在定义此组件ID为“tabs”,表示允许加入多个标签

4、由于TabHost是FrameLayout的子类,所以要想定义标签页内容必须使用FrameLayout布局,并且标签ID为“tabcontent”

 至于为什么要遵循这些条件,我们打看下TabHost的源码就可以发现:

2、每个标签的布局文件 tab_layout.xml


<ImageView  
    android:id="@+id/image"  
    android:layout\_width="wrap\_content"  
    android:layout\_height="wrap\_content"  
    android:padding="3dp" />

<TextView  
    android:id="@+id/title"  
    android:layout\_width="wrap\_content"  
    android:layout\_height="wrap\_content"  
    android:textColor="@android:color/white"/>

3、一个选择器,用于美观效果 tab_selector.xml




4、跳转Activity的布局文件(由于基本一致,这里只给出其中一个)

tabactivity.xml


<LinearLayout  
    android:layout\_width="match\_parent"  
    android:layout\_height="match\_parent"  
    android:orientation="vertical" >

    <TextView  
        android:id="@+id/title"  
        android:layout\_width="wrap\_content"  
        android:layout\_height="wrap\_content"  
        android:text="我是界面1"/>  
</LinearLayout>

5、JAVA主代码

package com.example.tabhosttest;

import android.app.ActivityGroup;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TabHost;
import android.widget.TabHost.TabSpec;
import android.widget.TextView;

public class MainActivity extends ActivityGroup{

private TabHost tabHost;//声明一个TabHost对象

//资源文件  
private Class activitys\[\]={TabActivity1.class,TabActivity2.class,TabActivity3.class,TabActivity4.class,TabActivity5.class};//跳转的Activity  
private String title\[\]={"首页","搜索","设置","主题","更多"};//设置菜单的标题  
private int image\[\]={R.drawable.tab\_icon1,R.drawable.tab\_icon2,R.drawable.tab\_icon3,R.drawable.tab\_icon4,R.drawable.tab\_icon5,};//设置菜单

@Override  
protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.activity\_main);  
    initTabView();//初始化tab标签

}

private void initTabView() {  
    //实例化tabhost  
    this.tabHost=(TabHost) findViewById(R.id.mytabhost);  
    //由于继承了ActivityGroup,所以需要在setup方法里加入此参数,若继承TabActivity则可省略  
    tabHost.setup(this.getLocalActivityManager());

    //创建标签  
    for(int i=0;i<activitys.length;i++){  
        //实例化一个view作为tab标签的布局  
        View view=View.inflate(this, R.layout.tab\_layout, null);

        //设置imageview  
        ImageView imageView=(ImageView) view.findViewById(R.id.image);  
        imageView.setImageDrawable(getResources().getDrawable(image\[i\]));  
        //设置textview  
        TextView textView=(TextView) view.findViewById(R.id.title);  
        textView.setText(title\[i\]);  
        //设置跳转activity  
        Intent intent=new Intent(this, activitys\[i\]);

        //载入view对象并设置跳转的activity  
        TabSpec spec=tabHost.newTabSpec(title\[i\]).setIndicator(view).setContent(intent);

        //添加到选项卡  
        tabHost.addTab(spec);  
    }

}

}

这里有个重载方法setIndicator(),这里是用来设置标签页:

1、public TabHost.TabSpec setIndicator(CharSequence label)

设置标题,此时无图标

2、public TabHost.TabSpec setIndicator(CharSequence label, Drawable icon)

设置标题、图标(这里的图标可以用getResources().getDrawable(int id))来设置

3、public TabHost.TabSpec setIndicator(View view)

设置自定义view

还有个setContent(Intent intent),这里是用来设置标签内容的,也就是我们要跳转的Activity

由于这里有5个选项卡,因此就有5个Activity,具体内容就看自己需求了,这里就不再给出

记得写完Activity要在AndroidManifest.xml配置文件中声明


<uses-sdk  
    android:minSdkVersion="8"  
    android:targetSdkVersion="21" />

<application  
    android:allowBackup="true"  
    android:icon="@drawable/ic\_launcher"  
    android:label="@string/app\_name"  
    android:theme="@style/AppTheme" >  
    <activity  
        android:name=".MainActivity"  
        android:label="@string/app\_name" >  
        <intent-filter>  
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />  
        </intent-filter>  
    </activity>  
    <activity  
        android:name="com.example.tabhosttest.TabActivity1"  
        android:label="@string/app\_name" >  
    </activity>  
    <activity  
        android:name="com.example.tabhosttest.TabActivity2"  
        android:label="@string/app\_name" >  
    </activity>  
    <activity  
        android:name="com.example.tabhosttest.TabActivity3"  
        android:label="@string/app\_name" >  
    </activity>  
    <activity  
        android:name="com.example.tabhosttest.TabActivity4"  
        android:label="@string/app\_name" >  
    </activity>  
    <activity  
        android:name="com.example.tabhosttest.TabActivity5"  
        android:label="@string/app\_name" >  
    </activity>  
</application>