今天讲一下,如何在TabHost中,再放TabHost。
先来看一下效果。
一层TabHost
两层Tabhost (内部TabHots在上面)
两层TabHost (内层TabHots在下面)
下面说一下代码,一共3个 java类,3个xml布局文件。
看一下主画面:
main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@android:id/tabhost" android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="@drawable/default_bg">
- <LinearLayout android:orientation="vertical"
- android:layout_width="fill_parent" android:layout_height="fill_parent">
- <TabWidget android:id="@android:id/tabs"
- android:layout_alignParentBottom="true" android:layout_width="fill_parent"
- android:layout_height="wrap_content"/>
- <FrameLayout android:id="@android:id/tabcontent"
- android:layout_weight="1" android:layout_width="fill_parent"
- android:layout_height="fill_parent" />
- </LinearLayout>
- </TabHost>
就是常规的Tabhost布局。
入口类:
DoubleTabHost.java
- package com.yfz;
- import android.app.TabActivity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.widget.TabHost;
- /**
- * 本类继承了TabActivity
- * @author Administrator
- *
- */
- public class DoubleTabHost extends TabActivity {
- /* 注意:
- * 对于TabHost、布局文件中必须包含
- * TabHost、TabWidget 、FrameLayout
- * 如果继承TabActivity,并且通过getTabHost()方法来获取TabHost
- * 那么三者的ID必须是android.R.id.tabhost、android.R.id.tabs、android.R.id.tabcontent
- *
- * 如果继承Activity,可以通过findViewById来获取这三个组件,此时ID可自定义
- */
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- TabHost mTabHost = getTabHost();
- mTabHost.addTab(mTabHost.newTabSpec("Twitter").setIndicator(
- "Twitter",
- getResources().getDrawable(android.R.drawable.arrow_down_float)).setContent(
- new Intent(this, SubTab.class)));
- mTabHost.addTab(mTabHost.newTabSpec("Facebook").setIndicator(
- "Facebook",
- getResources().getDrawable(android.R.drawable.arrow_down_float)).setContent(
- new Intent(this, NormalActivity.class)));
- mTabHost.setCurrentTab(0);
- }
- }
对于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错误:
- ERROR/AndroidRuntime(8301): Caused by: java.lang.RuntimeException: Your content must have a TabHost whose id attribute is 'android.R.id.tabhost'
TabWidget ID 错误:
- ERROR/AndroidRuntime(8354): Caused by: java.lang.RuntimeException: Your TabHost must have a TabWidget whose id attribute is 'android.R.id.tabs'
FrameLayout ID错误:
- 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
- <?xml version="1.0" encoding="utf-8"?>
- <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/mytabhost" android:layout_width="fill_parent