Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 763|回复: 0

[实例教程]android Tabhost部件

[复制链接]

该用户从未签到

发表于 2011-10-22 14:12:14 | 显示全部楼层 |阅读模式
本文结合源代码和实例来说明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  

        androidrientation="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));  




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


源码下载:  atab.rar (26.26 KB, 下载次数: 19)
回复

使用道具 举报

该用户从未签到

发表于 2011-10-22 14:12:20 | 显示全部楼层

Re:[实例教程]android

好好的学习啊
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-22 14:12:29 | 显示全部楼层

Re:[实例教程]android

呵呵,界面简洁、酷!
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-22 14:12:37 | 显示全部楼层

Re:[实例教程]android

顶你一个。
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-22 14:12:42 | 显示全部楼层

Re:[实例教程]android

TabHost 控件的缺点是TabWidget太难看了,TabWidget的自定义性太差了。
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-22 14:12:47 | 显示全部楼层

Re:[实例教程]android

TabHost 控件的缺点是TabWidget太难看了,TabWidget的自定义性太差了。
可以自定义ImageButton作为TabWidget,这样就比较美观了。
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2011-10-22 14:12:53 | 显示全部楼层

Re:[实例教程]android

拿了必顶
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-22 19:33 , Processed in 0.391830 second(s), 45 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表