Android控件-TabHost(一)
什么是TabHost?
![](http://images0.cnblogs.com/blog/614265/201409/160025582536141.jpg)
TabHost选项卡,说到这个组件,不得不先说一件事情,翻翻谷歌提供给我们的API,我们可以发现这样的一段话:
它告诉我们,这个组件在安卓4.0之后已经被废弃了,建议我们新的程序应该使用Fragment组件来代替它。
其实并不出乎意料,使用过TabHost的朋友应该都知道:
1、它的设计违反了Activity单一窗口原则,它可以同时加载多个Activity,然后再它们之间进行来回切换。
2、有个很致命的问题就是当我们点击别的选项时,按下Back后退键,它会使整个应用程序都退出,而不是切换到前一个选项卡,虽然我们可以在主程序里覆写OnKeyDown这个方法,但这样就会导致每一次按下Back后退键都只能回到第一个选项菜单。
但作为开发者,这个具有历史里程碑的组件,我们还是需要去掌握下,下面给几张图来看下今天要实现的效果:
下面附上代码(注释很详细)
实现TabHost有两种方式:
方式一:直接让一个Activity程序继承TabActivity类(通过getTabHost取得实例);
![](http://images0.cnblogs.com/blog/614265/201409/160238327537596.jpg)
activity_main.xml(为了使选项卡显示在屏幕下方,这里采用了相对布局)
<TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mytabhost" android:layout_width="fill_parent" android:layout_height="fill_parent"> <!-- 需要一个布局管理器 --> <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent" > <!-- 由于TabHost是继承于FrameLayout,所以需要一个FrameLaytout布局(内容页) ,id 必须为tabcontent --> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="fill_parent" android:layout_height="fill_parent" > </FrameLayout> <!-- TabWidget必须标签,用来存放tab标签,且id必须为tabs --> <TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/tab_widget_background" android:layout_alignParentBottom="true" > </TabWidget> </RelativeLayout> </TabHost>
TabHost的布局的文件必须遵循下面几点:
1、所有的用于标签配置的文件,必须以“<TabHost>”为根节点;
2、为了保证标签页和标签内容显示正常(例如:标签提示要放在标签显示内容之上)则可以采用一个布局管理器进行布局(例如:LinearLayout,RelativeLayout..)
3、定义一个“<TagWidget>”的标签,用于表示整个标签容器,另外在定义此组件ID为“tabs”,表示允许加入多个标签
![](http://images0.cnblogs.com/blog/614265/201409/152353213627283.jpg)
![](http://images0.cnblogs.com/blog/614265/201409/152353403464783.jpg)
![](http://images0.cnblogs.com/blog/614265/201409/152354110658231.jpg)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_horizontal" android:background="@drawable/tab_selector" android:orientation="vertical" > <ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="3dp" /> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@android:color/white"/> </LinearLayout>
3、一个选择器,用于美观效果 tab_selector.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:state_pressed="true" android:drawable="@drawable/tab_item_p" ></item> <item android:state_selected="true" android:drawable="@drawable/tab_item_d" ></item> </selector>
4、跳转Activity的布局文件(由于基本一致,这里只给出其中一个)
tabactivity.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="我是界面1"/> </LinearLayout> </RelativeLayout>
5、JAVA主代码
package com.example.tabhosttest; import android.app.ActivityGroup; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.ImageView; import android.widget.TabHost; import android.widget.TabHost.TabSpec; import android.widget.TextView; public class MainActivity extends ActivityGroup{ private TabHost tabHost;//声明一个TabHost对象 //资源文件 private Class activitys[]={TabActivity1.class,TabActivity2.class,TabActivity3.class,TabActivity4.class,TabActivity5.class};//跳转的Activity private String title[]={"首页","搜索","设置","主题","更多"};//设置菜单的标题 private int image[]={R.drawable.tab_icon1,R.drawable.tab_icon2,R.drawable.tab_icon3,R.drawable.tab_icon4,R.drawable.tab_icon5,};//设置菜单 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initTabView();//初始化tab标签 } private void initTabView() { //实例化tabhost this.tabHost=(TabHost) findViewById(R.id.mytabhost); //由于继承了ActivityGroup,所以需要在setup方法里加入此参数,若继承TabActivity则可省略 tabHost.setup(this.getLocalActivityManager()); //创建标签 for(int i=0;i<activitys.length;i++){ //实例化一个view作为tab标签的布局 View view=View.inflate(this, R.layout.tab_layout, null); //设置imageview ImageView imageView=(ImageView) view.findViewById(R.id.image); imageView.setImageDrawable(getResources().getDrawable(image[i])); //设置textview TextView textView=(TextView) view.findViewById(R.id.title); textView.setText(title[i]); //设置跳转activity Intent intent=new Intent(this, activitys[i]); //载入view对象并设置跳转的activity TabSpec spec=tabHost.newTabSpec(title[i]).setIndicator(view).setContent(intent); //添加到选项卡 tabHost.addTab(spec); } } }
这里有个重载方法setIndicator(),这里是用来设置标签页:
1、public TabHost.TabSpec setIndicator(CharSequence label)
设置标题,此时无图标
2、public TabHost.TabSpec setIndicator(CharSequence label, Drawable icon)
设置标题、图标(这里的图标可以用getResources().getDrawable(int id))来设置
3、public TabHost.TabSpec setIndicator(View view)
设置自定义view
还有个setContent(Intent intent),这里是用来设置标签内容的,也就是我们要跳转的Activity
由于这里有5个选项卡,因此就有5个Activity,具体内容就看自己需求了,这里就不再给出
记得写完Activity要在AndroidManifest.xml配置文件中声明
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.tabhosttest" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.example.tabhosttest.TabActivity1" android:label="@string/app_name" > </activity> <activity android:name="com.example.tabhosttest.TabActivity2" android:label="@string/app_name" > </activity> <activity android:name="com.example.tabhosttest.TabActivity3" android:label="@string/app_name" > </activity> <activity android:name="com.example.tabhosttest.TabActivity4" android:label="@string/app_name" > </activity> <activity android:name="com.example.tabhosttest.TabActivity5" android:label="@string/app_name" > </activity> </application> </manifest>