TabHost是一种非常实用的组件,TabHost可以很方便地在窗口上放置多个便签页,每个标签页相当于获得了一个与外部容器相同大小的组件摆法区域。通过这种方式,就可以在一个容器里放置更多组件,例如手机系统都会在同一个窗口定义多个便签来显示通话记录,包括“未接电话”、“已接电话”、“呼出电话”等。

与TabHost结合使用的还有如下组件。

  • TabWidget:代表选项卡的标签条。
  • TabSpec:代表选项卡的一个Tab页面。

TabHost仅仅是一个简单的容器,它提供了如下两个方法来创建、添加选项卡。

  • newTabSpec(String tag):创建选项卡。
  • addTab(TabHost.TabSpec tabSpec):添加选项卡。

使用TabHost的一般步骤如下。

  1. 在界面布局中定义TabHost组件,并为该组件定义该选项卡的内容。
  2. Activity应该继承TabActivity。
  3. 调用TabActivity的getTabHost()方法获取TabHost对象。
  4. 通过TabHost对象的方法来创建、添加选项卡。

除此之外,TabHost还提供了一些方法获取当前选项卡,获取当前View的方法,具体可参考API文档。如果程序需要监控TabHost里当前标签页的改变,可以为它设置TabHost.OnTabChangeListener监听器。

下面通过一个简单的实例来示范选项卡的用法。

实例:通话记录页面

下面的示例程序使用TabHost定义一个标签容器,并使用了三个LinearLayout来定义标签页(实际上可以使用任何View组件来定义标签页)。该程序的界面布局文件如下。

<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"

android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="2"
>
<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TabWidget android:id="@android:id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<FrameLayout android:id="@android:id/tabcontent"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- 定义一个标签页的内容 -->
<LinearLayout android:id="@+id/tab01"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:id="@+id/tx01"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="女儿国国王 - 2013/08/31"/>
<TextView android:id="@+id/tx02"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="东海龙女 - 2013/08/31"/>
</LinearLayout>
<!-- 定义第二个标签页的内容 -->
<LinearLayout android:id="@+id/tab02"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView android:id="@+id/tx03"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="火龙王 - 13969004275"
/>
<TextView android:id="@+id/tx04"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="牛魔王- 13791030073"
/>
</LinearLayout>
<!-- 定义第三个标签的内容 -->
<LinearLayout android:id="@+id/tab03"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:textSize="11pt">
<TextView android:id="@+id/tx05"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="齐天大圣 - 13969004275"/>
<TextView android:id="@+id/tx06"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="孙悟空- 13791030073"/> </LinearLayout>
</FrameLayout> </LinearLayout> </TabHost>

请注意上面的布局文件中粗体字代码部分,从上面布局文件中可以发现,TabHost容器内部需要组合两个组件:TabWidget和FrameLayout,其中TabWidget定义选项卡的标题条;FrameLayout则用于“层叠”组合多个选项卡页面。不仅如此,上面的布局文件中这三个组件的ID也有改变。

  • TabHost的ID应该为@android:id/tabhos。
  • TabWidget的ID应该为@android:id/tabs。
  • FrameLayout的ID应该为@android:id/tabcontent。

上面这三个ID并不是开发者自己定义的,而是引用了Android系统已有的ID。

接下来主程序即可加载该布局资源,并将布局文件中的三个Tab页面添加到该TabHost容器中。该Activity代码如下。

package org.crazyit.helloworld;

import android.os.Bundle;
import android.app.Activity;
import android.app.TabActivity;
import android.view.Menu;
import android.widget.TabHost;
import android.widget.TabHost.TabSpec; public class TabHostTest extends TabActivity { @SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tab_host_test);
//获取该Activity里面的TabHost组价
@SuppressWarnings("deprecation")
TabHost tabHost=getTabHost();
//创建第一个Tab页
TabSpec tab1=tabHost.newTabSpec("tab1")
.setIndicator("已接电话")//设置标题
.setContent(R.id.tab01);//设置内容
//添加第一个标签页
tabHost.addTab(tab1); TabSpec tab2=tabHost.newTabSpec("tab2")
//在标签标题上放置图标
.setIndicator("呼出电话",getResources().getDrawable(R.drawable.ic_action_search))
.setContent(R.id.tab02);
//添加第二个标签
tabHost.addTab(tab2);
TabSpec tab3=tabHost.newTabSpec("tab3")
.setIndicator("未接电话").setContent(R.id.tab03);
//添加第三个标签页
tabHost.addTab(tab3);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.tab_host_test, menu);
return true;
} }

上面的程序中粗体字代码就是为TabHost创建、并添加Tab页面的代码。上面的程序中一共添加三个标签页,因此类似粗体字的代码一共写了三次。其中第二个标签的标题上还添加了一个图片。

运行上面的程序将看到如下效果:

上面的程序调用了TabHost.TabSpec对象的setContent(int viewID)方法来设置标签页内容;除此之外还可调用setContent(Intent intent)方法来设置标签页内容,Intent还可用于启动其他Activity——这意味着TabHost.TabSpec可直接装载另一个Activity。

选项卡(TabHost)的功能与用法的更多相关文章

  1. Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信

    以下内容为原创,转载请注明:http://www.cnblogs.com/tiantianbyconan/p/3360938.html 如新浪微博下面的标签切换功能,我以前也写过一篇博文(http:/ ...

  2. Android 自学之画廊视图(Gallery)功能和用法

    Gallery与之前讲的Spinner有共同的父类:AbsSpinner,表明Gallery和Spinner都是一个列表框.他们之间的区别在于Spinner显示的是一个垂直的列表框,而Gallery显 ...

  3. Android 自学之选项卡TabHost

    选项卡(TabHost)是一种非常实用的组件,TabHost可以很方便地在窗口上放置多个标签页,每个标签页相当于获得了一个与外部容器相同大小的组建摆放区域.通过这种方式,就可以在一个容器中放置更多组件 ...

  4. 搜索框(SearchView)的功能与用法

    SearchView是搜索框组件,它可以让用户在文本框内输入汉字,并允许通过监听器监控用户输入,当用户用户输入完成后提交搜索按钮时,也通过监听器执行实际的搜索. 使用SearchView时可以使用如下 ...

  5. 数值选择器(NumberPicker)的功能与用法

    数值选择器用于让用户输入数值,用户既可以通过键盘输入数值,也可以通过拖动来选择数值.使用该组件常用如下三个方法. setMinValue(int minVal):设置该组件支持的最小值. setMax ...

  6. 日历视图(CalendarView)组件的功能和用法

    日历视图(CalendarView)可用于显示和选择日期,用户既可选择一个日期,也可通过触摸来滚动日历.如果希望监控该组件的日历改变,可调用CalendarView的setOnDateChangeLi ...

  7. 星级评分条(RatingBar)的功能和用法

    星级评分条与拖动条有相同的父类:AbsSeekBar,因此它们十分相似.实际上星级评分条与拖动条的用法.功能都十分接近:它们都是允许用户通过拖动条来改变进度.RatingBar与SeekBar最大区别 ...

  8. 拖动条(SeekBar)的功能和用法

    拖动条和进度条非常相似,只是进度条采用颜色填充来表明进度完成的程序,而拖动条则通过滑块的位置来标识数值——而且拖动条允许用户拖动滑块来改变值,因而拖动条通常用于对系统的某种数值进行调节,比如调节音量等 ...

  9. StackView的功能和用法

    StackView也是AdapterViewAnimator的子类,它也用于显示Adapter提供的系列View.SackView将会以“堆叠(Stack)”方式来显示多个列表项. 为了控制Stack ...

  10. MySQL常用存储引擎功能与用法详解

    本文实例讲述了MySQL常用存储引擎功能与用法. MySQL存储引擎主要有两大类: 1. 事务安全表:InnoDB.BDB. 2. 非事务安全表:MyISAM.MEMORY.MERGE.EXAMPLE ...

随机推荐

  1. android4.0下如何判断手机是否有底部物理按键(menu物理按键)

    某些手机底部是在触摸屏内部有软按键,就是如(back,home,menu 等)而有的手机底部(非屏幕内部)有物理按键,就是生产厂商不愿意有google自带的虚拟按键,而做的电容式的物理按键,如(bac ...

  2. zencart 掉炸天的tpl_main_page.php

    <?php /** * Common Template - tpl_main_page.php * * @version $Id: tpl_main_page.php 7085 2007-09- ...

  3. BLDC(无刷直流电机)应用相关

    1.基于XC866的直流无刷电机简易正弦波控制 http://blog.gkong.com/hushunlin_219521.ashx 2.无刷直流电机的PWM调制方式介绍 http://blog.g ...

  4. 使用Visual Studio 2008创建你的第一个Windows Mobile程序介绍

    使用Visual Studio 2008创建你的第一个Windows Mobile程序介绍 Windows MobileMobileWindowsMicrosoftWinForm 介绍 Microso ...

  5. egret dragonbones部件替换产生位移的解决方案

    原理:使用Armature.getSlot("urpart").display.texture去替换骨骼纹理即可需要:1 骨骼动画导出的时候不要裁剪部件的透明区域,在导出设置里面设 ...

  6. angular中控制器之间的通讯方式

    1, 利用作用域的继承方式 由于作用域的继承是基于js的原型继承方式,所以这里分为两种情况,当作用域上面的值为基本类型的时候,修改父作用域上面的值会 影响到子作用域,反之,修改子作用域只会影响子作用域 ...

  7. [iOS]C语言技术视频-10-指针变量

    下载地址: 链接: http://pan.baidu.com/s/1jGjbaXg 密码: u2t9

  8. ICE第三篇------一些疑难点

    1 间接代理 参考http://blog.sina.com.cn/s/blog_53e8499c0100lkoo.html IceGrid用于支持分布式网络服务应用,一个IceGrid域由一个注册表( ...

  9. EF 报【序列包含一个以上的元素】解决办法

    1.检查模型是否存在重复的字段,eg: public class AggregateRoot { public System.Guid Guid { get; set; } } public part ...

  10. SpringMVC轻松学习-SpringMVC介绍(一)

    Spring  MVC 背景介绍 Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块.使用 Spring 可插入的 MVC 架构,可以选择是使用内置的 Spring Web 框架还是 ...