当前位置: 首页 > 编程日记 > 正文

android Tabhost部件

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

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

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

private TabWidget mTabWidget;
    private FrameLayout mTabContent;
    private List<TabSpec> 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"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinearLayout01" android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <TextView android:text="tab1 with linear layout"
        android:id="@+id/TextView01" android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </TextView>
</LinearLayout>


然后是tab2.xml是一个FrameLayout布局

<?xml version="1.0" encoding="utf-8"?>
    <FrameLayout  xmlns:android="http://schemas.android.com/apk/res/android"
   
    android:id="@+id/FrameLayout02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <LinearLayout android:id="@+id/LinearLayout02"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
            <TextView android:text="tab2"
                android:id="@+id/TextView01" android:layout_width="wrap_content"
                android:layout_height="wrap_content">
            </TextView>
        </LinearLayout>
       
    </FrameLayout>
接着要注册这两个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<TabSpec> mTabSpecs = new ArrayList<TabSpec>(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"?> 
<TabHost xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/tabhost" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <LinearLayout 
        android:orientation="vertical" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"> 
        <TabWidget 
            android:id="@android:id/tabs" 
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content" /> 
        <FrameLayout 
            android:id="@android:id/tabcontent" 
            android:layout_width="fill_parent" 
            android:layout_height="fill_parent"> 
            
        </FrameLayout> 
    </LinearLayout> 
</TabHost>

注意的是:除了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容器:
    源代码是这样说的:

<p>Call setup() before adding tabs if loading TabHost using findViewById(). <i><b>However</i></b>: You do
      * not need to call setup() after getTabHost() in {@link 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));

运行结果同上。 如有问题欢迎提出。

转载请说明出处。。。


加上源代码,有用了可以下载下:/Files/freeman1984/atab.rar

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lastsweetop/archive/2010/05/07/5566200.aspx

相关文章:

网易开源支持图像识别的自动化UI测试工具,零基础亲测好评!

编辑 | Jane出品 | AI科技大本营AI科技大本营给大家推荐了很多有意思、适合开发者们的工具&#xff0c;比如代码修复神器、帮小白快速分析 Error、PDF 翻译工具、变量命名神器等等。今天&#xff0c;营长要专门给测试人员&#xff0c;或者想做测试的小伙伴们推荐一款工具&#…

【驱动】GPIO 作为按键时的 设备树 配置

#【驱动】GPIO作为按键时的 设备树 配置 0、设备树 0.0 别名 imx6ul.dtsi 什么作用&#xff1f;&#xff1f;&#xff1f; /*************开始/ / { aliases {… gpio0 &gpio1; gpio1 &gpio2; gpio2 &gpio3; gpio3 &gpio4; gpio4 &gpio5; /**********…

最小树形图及其生产方法

诸位看官&#xff0c;这是我第一次在整篇文章的所有图片里面加水印。小弟写博客的时间不长&#xff0c;就有两篇博客被盗用并未注明原文网址。这一方面使我痛心不已&#xff0c;另一方面迫使我不得不重新考虑一下版权保护问题。小弟不是吝啬鬼&#xff0c;如果影响阅读或者是确…

【数据库】MySQL的C语言接口学习

0、【初始化】 MYSQL* mysql_init(MYSQL *mysql); 1、【设置连接选项】 int mysql_options(MYSQL *mysql,enum mysql_option option, const void *arg); 2、【连接】 MYSQL* mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, cons…

程序员单身比例有多高?【2019开发者图鉴】告诉你

编辑 | Jane 出品 | AI科技大本营 本次调查共 8 个问题&#xff0c;根据这些数字我们整理了《2019开发者图鉴》&#xff0c;下面营长将发现的一些有意思的数字分享给大家&#xff1a; 性别与年龄 本次参与调查的男女比例约为 8&#xff1a;2&#xff08;男8女2&#xff09;。 …

26.2. Web UI

http://localhost:3000/ 原文出处&#xff1a;Netkiller 系列 手札 本文作者&#xff1a;陈景峯 转载请与作者联系&#xff0c;同时请务必标明文章原始出处和作者信息及本声明。

VC++ 6.0的小花招

Visual Studio系列中产品中&#xff0c;Visual Studio 6.0是最经典的一个版本&#xff0c;虽然后来有Visual Studio .NET 2003&#xff0c;以及2005&#xff0c;也确实添加了很多让我觉得激动的特性&#xff0c;但是从使用细节的细腻程度上来看&#xff0c;VS 6.0无疑是最棒的。…

【linux】嵌入式中 crontab的使用

0、编辑 执行&#xff1a;crontab -e 执行命令后&#xff0c;将出现一个编辑界面&#xff0c;内容格式如下 Minute Hour Day Month Dayofweek command 分钟 小时 天 月 天每星期 命令 每个字段代表的含义如下&#xff1a; Minute 每个小时的第几分钟执行该任务 Hour 每天的第几…

程序员该怎么做,才能成为coding王者?

每当做编程题目时&#xff0c;大多数人都会靠基本的直觉&#xff0c;遵循一些固定的步骤来有效地解题。不管是有意还是无意&#xff0c;在做编程题目的时你会下意识地遵循一些步骤&#xff0c;在阅读完这篇文章后你就可以将这些步骤和这篇文章联系起来&#xff0c;从而就可以更…

27.3. source code

tar zxvf bandwidthd-2.0.1.tgz cd bandwidthd-2.0.1 ./configure --prefix/srv/bandwidthd-2.0.1 make make install 原文出处&#xff1a;Netkiller 系列 手札 本文作者&#xff1a;陈景峯 转载请与作者联系&#xff0c;同时请务必标明文章原始出处和作者信息及本声明。

WF4.0实战(一):文件审批流程

http://www.cnblogs.com/zhuqil/archive/2010/04/13/DocumentApprovalProcess.html转载于:https://www.cnblogs.com/Little-Li/archive/2010/06/01/1749392.html

AI科技大本营在线公开课大放送(附演讲PPT)

新年新思&#xff01;新一年&#xff0c;每个人的梦想都闪耀着多彩光芒&#xff0c;对于AI领域的每一位学习者和从业者&#xff0c;我们充满渴望&#xff0c;怀揣梦想&#xff0c;心系对技术的不懈追求。AI科技大本营同样也有自己的新年梦想和脚踏实地的规划&#xff0c;比如今…

《微信跳一跳》安卓手机刷分软件搭建及攻略

2019独角兽企业重金招聘Python工程师标准>>> 元旦期间被微信小程序的游戏刷屏幕了。手笨脚笨的我也尝试了下这新出的小玩意&#xff0c;实在话手脚不协调最高仅仅90分&#xff0c;处于做技术的角度&#xff0c;直觉上可以技术上模拟解决&#xff0c;凑好朋友在微信群…

【libevent】libevent库学习总结(一)——基础

libevent库学习总结&#xff08;一&#xff09;——基础 一、基础 1.1、 介绍 Libevent是一个用于开发可伸缩网络服务器的事件通知库。Libevent API提供了一种机制来执行回调函数&#xff0c;当某个特定事件发生在文件描述符上或超时到达之后。此外&#xff0c;Libevent还支…

AS1.0(2.0)中的XML示例

虽然Flash早就升级为AS3.0&#xff0c;但是FMS的服务端编程依然仅支持AS1.0(2.0)&#xff0c;服务端与.net通讯的最简单方式莫过于请求一个RESTful的webService或wcf&#xff0c;通过它们返回的xml来获取数据。 var _xml:XML new XML("<ArrayOfstring xmlns\"htt…

【Qt】Qt发布可执行程序(打包依赖库)

Qt发布可执行程序&#xff08;打包依赖库&#xff09; 0、编译出可执行文件 如&#xff1a;xxx.exe 1、将xxx.exe拷贝到一个目录下面 2、启动Qt终端交互界面程序 如&#xff1a;Qt 5.6 for Desktop&#xff08;MinGW&#xff09; 3、进入xxx.exe所在的目录 4、执行命令…

小编说之“常见问题答疑”

2019独角兽企业重金招聘Python工程师标准>>> 关于前嗅Forespider爬虫的常见问题答疑 奋战在一线为客户答疑的狗蛋儿给小编提供了很多客户经常会问到的问题的素材&#xff0c;小编帮大家整理了一些&#xff0c;快来看看是不是都用的上吧&#xff01; 一、采集预览没有…

给AI开发者的新年礼物,技术公开课大放送(附演讲PPT)

各位AI科技大本营的伙伴大家好&#xff0c;营长携编辑组的全体成员给大家拜年了&#xff01; 新年新思&#xff01;新一年&#xff0c;每个人的梦想都闪耀着多彩光芒&#xff0c;对于AI领域的每一位学习者和从业者&#xff0c;我们充满渴望&#xff0c;怀揣梦想&#xff0c;心系…

通用权限管理组件使用说明书V3.0 错误校正 感谢自由软件职业者Helper(767870484)...

有时候&#xff0c;真想做个像样的东西出来&#xff0c;但是往往各方面的能力都不够&#xff0c;这么多人&#xff0c;Helper&#xff08;767870484&#xff09;仔细认真的阅读了这个帮助手册、并给给于了指正&#xff0c;在这里非常感谢&#xff0c;你的劳动成果已经被通用权限…

Reddit欲融资3亿美元,由腾讯领投

整理 | 一一出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;AI科技大本营消息&#xff0c;据 TechCrunch 报道&#xff0c;多个信源透露&#xff0c;美国社交网站 Reddit 将融资 1.5 亿到 3 亿美元&#xff0c;D 轮融资将由中国科技巨头腾讯公司领投&#xff0c;投前…

【libevent】libevent库学习总结(二)——编程步骤

一、libevent编程步骤 0、分配并初始化event_base&#xff0c;两种方法 0.1 event_base_new&#xff1a;线程安全&#xff0c;代替event_init&#xff1b; 0.2 event_init&#xff1a;线程不安全&#xff0c;不推荐使用&#xff0c;仅仅是为了向后兼容 1、创建event&#xf…

HP交换机配置命令

1.命名hostname 7-West-4F-2510 2.设置管理IPvlan 1ip address 192.168.41.123 255.255.255.03.修改支持的默认vlan数max-vlans 64max-vlans //修改vlan的数量&#xff0c;默认只有8个&#xff0c;修改后需重启后才可生效4.重启reload //重启交换机5.配置v…

【Qt】Qt程序编译成功,执行时报错:程序异常结束,crashed

【Qt】Qt程序编译成功&#xff0c;执行时报错&#xff1a;程序异常结束&#xff0c;crashed 错误打印信息 Starting E:*exe… 程序异常结束。 E:*.exe crashed. 原因 使用到外部库&#xff0c;编译时&#xff0c;指定了库连接&#xff0c;但是在程序运行时找不到库&#xf…

近900000条if-then关系图谱,让神经网络“懂”常识推理

编译整理 | 一一出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;“神经网络能学习日常事件的常识推理吗&#xff1f;能&#xff0c;如果在 ATOMIC 上训练的话。”ATOMIC&#xff08;原子&#xff09; 是一个机器常识图集&#xff0c;一个用自然语言建立的 870, 000 个…

weex 阶段总结

新年伊始&#xff0c;回顾过去的一年&#xff0c;收获很多&#xff0c;之前一直在研究weex&#xff0c;说心里话感觉心好累&#xff0c;官方文档不全&#xff0c;社区不活跃&#xff0c;遇到很多坑&#xff0c;官方发布的版本有时都有坑&#xff0c;搞得我都不敢更新版本了。 但…

DOS批处理高级教程精选(六)

为什么80%的码农都做不了架构师&#xff1f;>>> 第五章 set命令详解 很久没发贴了,今天来写点讲BAT的新手教学贴! 在上一贴中我简单的介绍了一下SET设置自定义变量的作用,现在我来具体讲一下set的其他功能. 一、用set命令设置自定义变量 显示、设置或删除 cmd.exe …

8.11. Migrating MySQL Data into Elasticsearch using logstash

https://www.elastic.co/guide/en/logstash/current/plugins-inputs-jdbc.html 8.11.1. 安装 logstash 安装 JDBC 驱动 和 Logstash curl -s https://raw.githubusercontent.com/oscm/shell/master/database/mysql/5.7/mysql-connector-java.sh | bash curl -s https://ra…

佩奇扑街、外星人疯狂!Python 告诉你大年初二应该看哪部电影

作者 | 罗昭成责编 | 唐小引转载自 CSDN资讯&#xff08;ID&#xff1a;CSDNnews&#xff09;引言2019 年 1 月&#xff0c;《啥是佩奇》短片在互联网快速传播&#xff0c;各大社交平台形成刷屏之势。不到 24 小时&#xff0c;官博发出的视频已经收获 2800 万次观看&#xff0c…

【POCO】POCO学习总结(二)——配置选择

使用方法: configure {options} options总结 –help&#xff1a;打印帮助 –config< config_name> 使用给定配置&#xff0c;在poco-1.7.8p3-all/build/config目录下&#xff0c;可以在对应的配置文件中修改编译工具的路径和名字&#xff0c;编译时的选项等。 AIX Darw…

告别排队!用Python定时自动挂号和快捷查询化验报告

作者 | 阿文来源 | 程序人生&#xff08;ID: coder_life&#xff09;我什么要做这个事情去年单位体检查出问题来&#xff0c;经过穿刺手术确诊是个慢性肾脏病2期&#xff0c; IGA 肾病三期&#xff0c;可能大家对于这个病并不是很了解&#xff0c;但是另外一个词可能大家都听过…