本文结合源代码和实例来说明TabHost的用法。

使用TabHost 可以在一个屏幕间进行不同版面的切换,例如android自带的拨号应用,截图:

查看tabhost的源代码,主要实例变量有:private TabWidget mTabWidget;

private FrameLayout mTabContent;

private List mTabSpecs

也就是说我们的tabhost必须有这三个东西,所以我们的.xml文件就会有规定:继续查看源代码:if (mTabWidget == null) {

throw new RuntimeException(

"Your TabHost must have a TabWidget whose id attribute is 'android.R.id.tabs'");

}

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'");

}

也就是说我们的.xml文件需要TabWidget和FrameLayout标签。

接下来构建我们自己的tab实例:

有两种方式可以实现:

一种是继承TabActivity 类,可以使用android的自己内部定义好的.xml资源文件作容器文件。也就是在我们的代码中使用getTabHost(); , 而相应的后台源码是这样的:this.setContentView(com.android.internal.R.layout.tab_content);

在系统的资源文件中可以看见这个layout

有了容器,然后我们就需要我们为每个tab分配内容,当然要可以是如何类型的标签:

例如我们构建一下.xml文件

首先tab1.xml 是一个LinearLayout布局<?xml version="1.0" encoding="utf-8"?>

android:id="@+id/LinearLayout01" android:layout_width="wrap_content"

android:layout_height="wrap_content">

android:id="@+id/TextView01" android:layout_width="wrap_content"

android:layout_height="wrap_content">

然后是tab2.xml是一个FrameLayout布局<?xml version="1.0" encoding="utf-8"?>

android:id="@+id/FrameLayout02"

android:layout_width="wrap_content"

android:layout_height="wrap_content">

android:layout_width="wrap_content"

android:layout_height="wrap_content">

android:id="@+id/TextView01" android:layout_width="wrap_content"

android:layout_height="wrap_content">

接着要注册这两个FrameLayout为tabhost的Content,也就是接下来的代码:LayoutInflater inflater_tab1 = LayoutInflater.from(this);

inflater_tab1.inflate(R.layout.tab1, mTabHost.getTabContentView());

inflater_tab1.inflate(R.layout.tab2, mTabHost.getTabContentView());

然后需要构建前面说的tabhost的第三个实例变量对应得内容,源代码中是这样的:private List mTabSpecs = new ArrayList(2);

初始化是两个tab的空间然后会自动扩展:

好 我们构建我们的tabspec:mTabHost.addTab(mTabHost.newTabSpec("tab_test1").setIndicator("TAB 11").setContent(R.id.LinearLayout01));

mTabHost.addTab(mTabHost.newTabSpec("tab_test1").setIndicator("TAB 11").setContent(R.id.FrameLayout02));

也就是把我们的2个layout作为他的content,当然FrameLayout中可以有其他的布局,来放我的组件。

我们不需要在代码里面设置setContentView();因为getTabHost(); 这个方法调用后就已经设置了,源代码:if (mTabHost == null) {

this.setContentView(com.android.internal.R.layout.tab_content);

}

也就是把系统的tab_content当做view设置。

运行后如下:

完整代码:TabHost mTabHost = getTabHost();

LayoutInflater inflater_tab1 = LayoutInflater.from(this);

inflater_tab1.inflate(R.layout.tab1, mTabHost.getTabContentView());

inflater_tab1.inflate(R.layout.tab2, mTabHost.getTabContentView());

mTabHost.addTab(mTabHost.newTabSpec("tab_test1").setIndicator("TAB 11").setContent(R.id.LinearLayout01));

mTabHost.addTab(mTabHost.newTabSpec("tab_test1").setIndicator("TAB 11").setContent(R.id.FrameLayout02));

还有一种就是定义我们自己的tabhost:不用继承TabActivity首先建立我们自己的.xml文件,当然要包含Tabhost,TabWidget,FrameLayout,着3个标签:<?xml version="1.0" encoding="utf-8"?>

android:id="@+id/tabhost"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

android:id="@android:id/tabs"

android:layout_width="fill_parent"

android:layout_height="wrap_content" />

android:id="@android:id/tabcontent"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

注意的是:除了tabhost的id可以自定义外,其他的必须使用系统的id,为什么后面说,

当然我们可以在FrameLayout里面添加view来作为tab的内容只需要在create tabspce时候添加就可以了,我们为了把每个tab的内容分开我们依然使用前面用到的两个tab xml文件

java代码:

获取TabHost 通过findviewbyid,setContentView(R.layout.main);

TabHost mTabHost = (TabHost)findViewById(R.id.tabhost);

接下来很重要的一步是要使用TabHost.setup();作用是来初始化我们的TabHost容器:

源代码是这样说的:Call setup() before adding tabs if loading TabHost using findViewById(). However You do

* not need to call setup() after getTabHost() in [email protected] android.app.TabActivity TabActivity}.

也就是说通过findviewbyid,方法获得tabhost必须setup 而通过getTabHost则不用。

setup干什么呢:源代码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'");

}

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的两个实例变量,这里也回答了为什么我们的id必须使用系统定义的id的原因

接下来工作就和前面相同了:LayoutInflater inflater_tab1 = LayoutInflater.from(this);

inflater_tab1.inflate(R.layout.tab1, mTabHost.getTabContentView());

inflater_tab1.inflate(R.layout.tab2, mTabHost.getTabContentView());

mTabHost.addTab(mTabHost.newTabSpec("tab_test1").setIndicator("TAB a").setContent(R.id.LinearLayout01));

mTabHost.addTab(mTabHost.newTabSpec("tab_test2").setIndicator("TAB b").setContent(R.id.FrameLayout02));

完整代码:setContentView(R.layout.main);

TabHost mTabHost = (TabHost)findViewById(R.id.tabhost);

mTabHost.setup();

LayoutInflater inflater_tab1 = LayoutInflater.from(this);

inflater_tab1.inflate(R.layout.tab1, mTabHost.getTabContentView());

inflater_tab1.inflate(R.layout.tab2, mTabHost.getTabContentView());

mTabHost.addTab(mTabHost.newTabSpec("tab_test1").setIndicator("TAB a").setContent(R.id.LinearLayout01));

mTabHost.addTab(mTabHost.newTabSpec("tab_test2").setIndicator("TAB b").setContent(R.id.FrameLayout02));

运行结果同上。

android tabhost用法详解,android Tabhost部件详解相关推荐

  1. android tablelayout用法,TableLayout布局的使用和详解

    TableLayout是继linearLayout布局的另一种布局方式,这中布局方式的优点就是布出来的局特别规整,行是行,列是列的. 你可以在自己脑海中脑补一下 把TableLayout想象成一个表格 ...

  2. android weakreference 用法,WeakReference 在android中的应用

    首先我们来看一段代码 public class AutoActivity extends Activity { Handler handler = new Handler(){ public void ...

  3. android组件用法说明,Android第三方控件PhotoView使用方法详解

    Android第三方控件PhotoView使用方法详解 发布时间:2020-10-21 15:06:09 来源:脚本之家 阅读:74 作者:zhaihaohao1 PhotoView的简介: 这是一个 ...

  4. android studio 导入包分不分动态静态,详解Android studio 动态fragment的用法

    fragment的使用时Android的基础,它有两种用法,第一个就是静态的fragment.第二个则是动态的fragment. 静态fragment直接在layout创建你想要的fragment的X ...

  5. android:stretchcolumns=quot;*quot;,详解Android TableLayout中stretchColumns、shrinkColumns的用法...

    详解Android 中TableLayout中stretchColumns.shrinkColumns的用法 android:stretchColumns="1" android: ...

  6. Android 之窗口小部件详解--App Widget

    1 App Widget简介 App Widget是应用程序窗口小部件(Widget)是微型的应用程序视图,它可以被嵌入到其它应用程序中(比如桌面)并接收周期性的更新.你可以通过一个App Widge ...

  7. Android 12 小部件详解

    来龙去脉 小部件兴起 2020年九月苹果的 iOS 14 正式版本发布,其中的一项重大更新就是苹果也支持小部件了!不容易啊,安卓好多年前拥有的功能现如今苹果终于用上了,先来看看苹果中的小部件样式吧! ...

  8. android include 控件详解,Android开发中include控件用法分析

    本文实例讲述了Android开发中include控件用法.分享给大家供大家参考,具体如下: 我们知道,基于Android系统的应用程序的开发,界面设计是非常重要的,它关系着用户体验的好坏.一个好的界面 ...

  9. android 剪贴板服务,Android剪贴板用法详解

    本文实例详述了Android剪贴板的用法,分享给大家供大家参考.具体方法分析如下: 这里首先需要注意的一点,就是在使用Android剪贴板的时候大家只记住一点就行了,不管是安卓设备还是PC机,复制粘贴 ...

  10. Android.mk用法详解

    Android.mk是Android提供的一个makefile文件,可以将源文件分组为模块.用来引用的头文件目录.需要编译的*.c/.cpp文件.jni源文件.指定编译生成.so共享库文件或者*.a静 ...

最新文章

  1. 虚拟机使用镜像文件安装系统
  2. SBB:不同植被土壤中细菌古菌的群落分布模式比较
  3. 全球及中国水刀机械行业发展态势及及投资决策建议报告2021年版
  4. SE16N新改表内容方法!!!
  5. 一篇不一样的docker原理解析 提高篇
  6. 东方智慧和西方智慧的比较
  7. Meta:绝对没有威胁要离开欧洲市场
  8. linux下命令行操作快捷键及技巧
  9. Mysql实现企业级数据库主从复制架构实战
  10. 697.数组的度(力扣leetcode) 博主可答疑该问题
  11. 做游戏开发,选择Unity还是Unreal?
  12. gMIS吉密斯导航菜单Navimenu、自动安装等更新
  13. ios睡眠分析 卧床 睡眠_在HealthKit中用 Swift 进行睡眠分析
  14. 文献阅读_Radiogenomic analysis of vascular endothelial growth factor in patients with diffuse gliomas
  15. 每天睡6小时和8小时的区别 看完再不敢熬夜了
  16. 制作一个简单的选项卡插件
  17. 【Android系统蓝牙开发】蓝牙基础知识-蓝牙核心系统架构
  18. 毛永胜计算机教师,呼和浩特市小学信息技术学科基本功获奖教师展示课活动
  19. 什么是悲观锁和乐观锁,及分布式锁的实现方式
  20. tplink控制上网设备_TP-LINK无线路由器怎么设置限制别人wifi网速

热门文章

  1. win服务器接她tar.gz文件,Window平台下压缩文件为tar.gz格式的方法
  2. 消防物联网,为逆行英雄守住第一道生命线
  3. linux下thinkpad X1 carbon 2018 电源管理
  4. Exchange2010删除指定账户指定主题邮件
  5. [译]区块链技术全解析入门版
  6. powerdesigner 16.5 Could not Initialize JavaVM!
  7. Python:用类与对象写一元二次方程计算器中遇到的错误
  8. 机器学习 高维数据可视化
  9. Java实现日历小程序【代码】
  10. 明清时期中央朝廷与地方关系中的江南著姓望族