`
baobeituping
  • 浏览: 1064453 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

【Android进阶】嵌套TabHost (TabHost中放TabHost,类似二级目录、二级树)

 
阅读更多

今天讲一下,如何在TabHost中,再放TabHost。

 

先来看一下效果。

 

一层TabHost

 

 

两层Tabhost (内部TabHots在上面)

 

两层TabHost (内层TabHots在下面)

 

 

 

下面说一下代码,一共3个 java类,3个xml布局文件。

 

看一下主画面:

main.xml

 

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <TabHost xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:id="@android:id/tabhost" android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:background="@drawable/default_bg">  
  6.     <LinearLayout android:orientation="vertical"   
  7.         android:layout_width="fill_parent" android:layout_height="fill_parent">  
  8.         <TabWidget android:id="@android:id/tabs"  
  9.             android:layout_alignParentBottom="true" android:layout_width="fill_parent"  
  10.             android:layout_height="wrap_content"/>  
  11.         <FrameLayout android:id="@android:id/tabcontent"  
  12.             android:layout_weight="1" android:layout_width="fill_parent"  
  13.             android:layout_height="fill_parent" />  
  14.     </LinearLayout>  
  15. </TabHost>  

 

 

 

就是常规的Tabhost布局。

 

入口类:

DoubleTabHost.java

 

  1. package com.yfz;  
  2. import android.app.TabActivity;  
  3. import android.content.Intent;  
  4. import android.os.Bundle;  
  5. import android.widget.TabHost;  
  6. /** 
  7.  * 本类继承了TabActivity 
  8.  * @author Administrator 
  9.  * 
  10.  */  
  11. public class DoubleTabHost extends TabActivity {  
  12.       
  13.      /* 注意: 
  14.      * 对于TabHost、布局文件中必须包含 
  15.      * TabHost、TabWidget 、FrameLayout  
  16.      * 如果继承TabActivity,并且通过getTabHost()方法来获取TabHost 
  17.      * 那么三者的ID必须是android.R.id.tabhost、android.R.id.tabs、android.R.id.tabcontent 
  18.      *  
  19.      * 如果继承Activity,可以通过findViewById来获取这三个组件,此时ID可自定义 
  20.      */  
  21.       
  22.     /** Called when the activity is first created. */  
  23.     @Override  
  24.     public void onCreate(Bundle savedInstanceState) {  
  25.         super.onCreate(savedInstanceState);  
  26.         setContentView(R.layout.main);  
  27.           
  28.         TabHost mTabHost = getTabHost();  
  29.         mTabHost.addTab(mTabHost.newTabSpec("Twitter").setIndicator(  
  30.                 "Twitter",  
  31.                 getResources().getDrawable(android.R.drawable.arrow_down_float)).setContent(  
  32.                 new Intent(this, SubTab.class)));  
  33.         mTabHost.addTab(mTabHost.newTabSpec("Facebook").setIndicator(  
  34.                 "Facebook",  
  35.                 getResources().getDrawable(android.R.drawable.arrow_down_float)).setContent(  
  36.                 new Intent(this, NormalActivity.class)));  
  37.         mTabHost.setCurrentTab(0);  
  38.     }  
  39. }  

 

 

 

 

对于TabHost、布局文件中必须包含TabHost、TabWidget 、FrameLayout .缺一不可

如果加载该TabHost画面的类继承TabActivity,并且想通过getTabHost()方法来获取TabHost,getTabWidget()方法获取TabWidget,

那么TabHost、TabWidget 、FrameLayout 三者的ID必须是android.R.id.tabhost、android.R.id.tabs、android.R.id.tabcontent

 

 

否则会报运行时异常,错误如下:

TabHost ID错误:

 

  1. ERROR/AndroidRuntime(8301): Caused by: java.lang.RuntimeException: Your content must have a TabHost whose id attribute is 'android.R.id.tabhost'  

 

 

 

TabWidget ID 错误:

 

  1. ERROR/AndroidRuntime(8354): Caused by: java.lang.RuntimeException: Your TabHost must have a TabWidget whose id attribute is 'android.R.id.tabs'  

 

 

 

FrameLayout  ID错误:

 

  1. ERROR/AndroidRuntime(8404): Caused by: java.lang.RuntimeException: Your TabHost must have a FrameLayout whose id attribute is 'android.R.id.tabcontent'  

 

 

 

 

子TabHost页面:

subtab.xml

 

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <TabHost xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:id="@+id/mytabhost" android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:background="@drawable/default_bg">  
  6.     <LinearLayout android:orientation="vertical"   
  7.         android:layout_width="fill_parent" android:layout_height="fill_parent">  
  8.         <!-- 注意FrameLayout/TabWidget标签的位置-->  
  9.         <FrameLayout android:id="@android:id/tabcontent"  
  10.             android:layout_weight="1" android:layout_width="fill_parent"  
  11.             android:layout_height="fill_parent" >  
  12.                 <TextView  
  13.                     android:id="@+id/widget59"  
  14.                     android:layout_width="wrap_content"  
  15.                     android:layout_height="wrap_content"  
  16.                     android:text="你在想什么?"  
  17.                     android:layout_alignParentTop="true"  
  18.                     android:layout_centerHorizontal="true"  
  19.                     >  
  20.                     </TextView>  
  21.                     <TextView  
  22.                     android:id="@+id/widget60"  
  23.                     android:layout_width="wrap_content"  
  24.                     android:layout_height="wrap_content"  
  25.                     android:text="我在想Android"  
  26.                     android:layout_alignParentTop="true"  
  27.                     android:layout_alignParentRight="true"  
  28.                     >  
  29.                     </TextView>  
  30.         </FrameLayout>  
  31.         <TabWidget android:id="@android:id/tabs"  
  32.             android:layout_alignParentBottom="true" android:layout_width="fill_parent"  
  33.             android:layout_height="wrap_content"/>  
  34.     </LinearLayout>  
  35. </TabHost>  

 

 

 

子TabHost页面加载类:

SubTab.java

 

  1. package com.yfz;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. import android.widget.TabHost;  
  5. import android.widget.TabWidget;  
  6. import android.widget.TextView;  
  7. /** 
  8.  *  
  9.  * @author Administrator 
  10.  * 
  11.  */  
  12. public class SubTab extends Activity {  
  13.       
  14.     @Override  
  15.     public void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.subtab);  
  18.           
  19.         //以下三句代码,注意顺序   
  20.         TabHost mTabHost = (TabHost)findViewById(R.id.mytabhost);  
  21.         mTabHost.setup();  
  22.         TabWidget tabWidget = mTabHost.getTabWidget();  
  23.           
  24.         mTabHost.addTab(mTabHost.newTabSpec("苏州").setIndicator(  
  25.                 "苏州").setContent(R.id.widget59));  
  26.         mTabHost.addTab(mTabHost.newTabSpec("上海").setIndicator(  
  27.                 "上海").setContent(R.id.widget60));  
  28.         mTabHost.addTab(mTabHost.newTabSpec("天津").setIndicator(  
  29.                 "天津").setContent(R.id.widget60));  
  30.         mTabHost.addTab(mTabHost.newTabSpec("北京").setIndicator(  
  31.                 "北京").setContent(R.id.widget60));  
  32.         mTabHost.setCurrentTab(0);  
  33.           
  34.         int height =30;   
  35. //      int width =45;    
  36.               
  37.         for (int i =0; i < tabWidget.getChildCount(); i++) {  
  38.               
  39.             /**设置高度、宽度,由于宽度设置为fill_parent,在此对它没效果 */   
  40.             tabWidget.getChildAt(i).getLayoutParams().height = height;   
  41. //            tabWidget.getChildAt(i).getLayoutParams().width = width;    
  42.             /**设置tab中标题文字的颜色,不然默认为黑色 */   
  43.              final TextView tv = (TextView) tabWidget.getChildAt(i).findViewById(android.R.id.title);   
  44.              tv.setTextColor(this.getResources().getColorStateList(android.R.color.white));   
  45.         }  
  46.     }  
  47. }  

 

 

 

如果加载TabHost画面的继承自Activity,可以通过findViewById来获取这三个组件,此时ID可自定义。

需要注意的是,此时必须调用setup方法来加载TabHost。

 

对了,不要忘了在AndroidManifest.xml定义Activity~~呵呵!

 

要点就这么多~ 就这样了。

 

注意:如果想要把tag放到顶部或者底部,只要交换FrameLayout android:id="@android:id/tabcontent"和<TabWidget android:id="@android:id/tabs"
   android:layout_alignParentBottom="true" android:layout_width="fill_parent"
   android:layout_height="wrap_content" />的位置,就实现了。

分享到:
评论

相关推荐

    Android 嵌套TabHost示例

    本示例是关于如何在Android中实现嵌套的TabHost,即两个层级的TabHost,类似于网页中的二级菜单栏,这种设计可以提供更丰富的用户交互体验。 首先,我们要理解TabHost的基本概念。TabHost是一个容器,它可以包含一...

    Android fragment 内部嵌套tabhost组件

    在"Android fragment 内部嵌套tabhost组件"这个主题中,我们将探讨如何在Fragment内部集成TabHost来创建一个可交互的多视图界面。以下是一些关键知识点: 1. **Fragment的生命周期**:Fragment有自己的生命周期,...

    安卓 tabhost嵌套tabhost

    在Android开发中,TabHost是一个非常重要的组件,用于创建具有多个选项卡的用户界面,每个选项卡都可以承载不同的活动(Activity)或者视图。当我们提到“安卓 TabHost 嵌套 TabHost”,这意味着在一个TabHost内,...

    嵌套TabHost

    嵌套TabHost则是一种更复杂的设计模式,它允许在一个TabHost中包含另一个TabHost,形成一个多级目录的选项卡结构,从而为用户提供更为丰富的交互体验。下面我们将深入探讨这种技术。 ### TabHost基本概念 1. **...

    安卓Android源码——嵌套TabHost示例.zip

    这个示例"安卓Android源码——嵌套TabHost示例.zip"提供了一个关于如何使用`TabHost`进行嵌套布局的实践案例。下面,我们将深入探讨`TabHost`的概念、工作原理以及如何实现嵌套`TabHost`。 `TabHost`是Android SDK...

    Android 嵌套TabHost示例.zip

    在Android中,TabHost通常包含两个主要部分:TabWidget和FrameLayout。TabWidget是显示选项卡的视图,而FrameLayout则用来显示与每个选项卡关联的内容。开发者可以通过TabSpec对象来定义每个选项卡,每个TabSpec包含...

    Android 嵌套TabHost示例.rar

    在"Android 嵌套TabHost示例"中,开发者可能已经实现了上述所有步骤,并且可能还包含了一些优化技巧,比如使用Fragment来代替Activity以减少内存消耗,或者使用Intent来传递数据和控制流程等。通过分析源码,我们...

    Android 嵌套TabHost示例.zip源码资源下载

    在这个"Android 嵌套TabHost示例.zip"源码资源中,我们将深入探讨如何在Android应用中实现嵌套的TabHost,以及与之相关的技术细节。 首先,TabHost是一个容器,它可以包含一个或多个TabWidget(标签控件)和一个...

    Android参考源码-嵌套TabHost示例.zip

    本示例"Android参考源码-嵌套TabHost示例.zip"提供了如何在Android应用中实现嵌套TabHost的方法。嵌套TabHost意味着在一个TabHost内嵌套另一个TabHost,这样可以创建更为复杂和层次化的用户界面。 首先,我们需要...

    Android 嵌套TabHost示例-IT计算机-毕业设计.zip

    在Android开发中,TabHost是一个...总之,这个"Android 嵌套TabHost示例"涵盖了Android开发中的核心概念和技术,对于学习者来说,是一个很好的实践项目,能帮助他们深入理解Android应用的构建过程,提升实际开发能力。

    tabhost 嵌套tabhost, 很简单的demo

    通过理解和实践这个"tabhost 嵌套tabhost"的demo,开发者可以掌握如何在Android应用中创建更加灵活和复杂的选项卡界面,提高用户导航的便利性。在实际项目中,可以根据需求进行适当的优化和调整,以满足特定的设计和...

    Android应用源码之嵌套TabHost示例.zip

    本示例"Android应用源码之嵌套TabHost示例.zip"深入探讨了如何在Android应用中实现嵌套的TabHost,这通常发生在需要在每个Tab中再分层次展示内容时。下面将详细讲解这个知识点。 首先,TabHost是Android SDK提供的...

    Android 嵌套TabHost示例.zip项目安卓应用源码下载

    Android 嵌套TabHost示例.zip项目安卓应用源码下载Android 嵌套TabHost示例.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考

    安卓开发-嵌套TabHost示例.zip.zip

    在Android应用开发中,TabHost是一个非常重要的组件,它用于创建多标签的用户界面,使得用户可以在不同的功能之间...通过理解和实践这个示例,开发者可以更好地掌握Android中的TabHost使用技巧,提升应用的开发水平。

    Android应用源码之嵌套TabHost示例-IT计算机-毕业设计.zip

    同时,它还涉及到了Intent的使用,Intent是Android中传递数据和启动活动的重要手段。此外,源码中的布局文件(XML)也会展示如何在界面上放置TabHost,并通过findViewById()方法获取到它。 总之,"Android应用源码...

    安卓Android源码——精典源码之嵌套TabHost示例.zip

    此压缩包"安卓Android源码——精典源码之嵌套TabHost示例.zip"提供了关于如何在应用中使用嵌套TabHost的实例代码。这个例子可能包含两个层次的TabHost,即在一个TabHost内部还有另一个TabHost,以实现更复杂的布局和...

    Android应用源码之嵌套TabHost示例.rar

    本示例"Android应用源码之嵌套TabHost示例"是一个很好的学习资源,展示了如何将TabHost与其它UI元素如Fragments或者Activities进行嵌套组合,来实现复杂的布局结构。 TabHost本身是Android SDK提供的一种容器,它...

Global site tag (gtag.js) - Google Analytics