转载至:http://blog.csdn.net/dawanganban/article/details/9916461
Tab标签页是界面设计时经常使用的界面控件,可以实现多个分页之间的快速切换,每个分页可以显示不同的内容
Tab标签页的使用
1.首先要设计所有的分页的界面布局
2.在分页设计完成后,使用代码建立Tab标签页,并给每个分页添加标识和标题
3.最后确定每个分页所显示的界面布局
每个分页建立一个XML文件,用以编辑和保存分页的界面布局,使用的方法与设计普通用户界面没有什么区别
使用Tab标签页的一般步骤
首先要设计所有的分页的界面布局
Activity继承TabActivity
调用TabActivity的getTabHost()方法获得TabHost对象
通过TabHost创建Tab
所谓的tabhost提供选项卡(Tab页)的窗口视图容器.此对象包含两个子对象: 一个是使用户可以选择指定标签页的标签的集合;另一个是用于显示标签页内容的 FrameLayout. 选项卡中的个别元素一般通过其容器对象来控制,而不是直接设置子元素本身的值.
先演示一个简单的例子,只有一个Activity,但要注意的是继承tabActivity这个类
第一步:在布局文件中main.xml敲入代码。注意这里用了FrameLayout,主要特点是可以覆盖其他内容,只显示当前的
1 <?xml version="1.0" encoding="utf-8"?> 2 3 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 4 android:id="@+id/FrameLayout01" 5 android:layout_width="wrap_content" 6 android:layout_height="wrap_content"> 7 8 <TextView 9 android:id="@+id/TextView01" 10 android:layout_width="wrap_content" 11 android:layout_height="wrap_content" 12 android:text="所有通话记录"></TextView> 13 14 <TextView 15 android:id="@+id/TextView02" 16 android:layout_width="wrap_content" 17 android:layout_height="wrap_content" 18 android:text="已接来电"></TextView> 19 20 <TextView 21 android:id="@+id/TextView03" 22 android:layout_width="wrap_content" 23 android:layout_height="wrap_content" 24 android:text="未接来电"></TextView> 25 26 </FrameLayout>
第二步:编写layouttab01Activity.java这个文件,比较简单。
1 package cn.edu.zwu.tel; 2 3 import android.app.TabActivity; 4 import android.os.Bundle; 5 import android.view.LayoutInflater; 6 import android.widget.TabHost; 7 import android.widget.Toast; 8 import android.widget.TabHost.OnTabChangeListener; 9 10 11 public class LayoutTab01Activity extends TabActivity { 12 @Override 13 public void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 16 TabHost th = getTabHost(); 17 //声明TabHost,然后用LayoutInflater过滤出布局来,给TabHost加上含有Tab页面的FrameLayout 18 //from(this)从这个TabActivity获取LayoutInflater 19 //R.layout.main 存放Tab布局 20 //通过TabHost获得存放Tab标签页内容的FrameLayout 21 //是否将inflate 拴系到根布局元素上 22 LayoutInflater.from(this).inflate(R.layout.main, th.getTabContentView(), true); 23 //通过TabHost获得存放Tab标签页内容的FrameLayout, 24 //newTabSpecd的作用是获取一个新的 TabHost.TabSpec,并关联到当前 TabHost 25 //setIndicator的作用是指定标签和图标作为选项卡的指示符. 26 //setContent的作用是指定用于显示选项卡内容的视图 ID. 27 th.addTab(th.newTabSpec("all").setIndicator("所有通话记录", getResources().getDrawable(R.drawable.call_forward)).setContent(R.id.TextView01)); 28 th.addTab(th.newTabSpec("ok").setIndicator("已接来电",getResources().getDrawable(R.drawable.phone_call)).setContent(R.id.TextView02)); 29 th.addTab(th.newTabSpec("cancel").setIndicator("未接来电",getResources().getDrawable(R.drawable.call_bluetooth)).setContent(R.id.TextView03)); 30 //setOnTabChangeListener的作业是注册一个回调函数,当任何一个选项卡的选中状态发生改变时调用. 31 th.setOnTabChangedListener( 32 new OnTabChangeListener() { 33 @Override 34 public void onTabChanged(String tabId) { 35 Toast.makeText(LayoutTab01Activity.this, tabId, Toast.LENGTH_LONG).show(); 36 } 37 } 38 ); 39 } 40 }
演示效果图:
第二种方法:没有用到FrameLayout这个布局,而直接用了listview,创建选项卡内容的回调函数creatTabContent()实现的
第一步:编写main.xml文件,具体代码如下
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="fill_parent" 4 android:layout_height="fill_parent" 5 android:orientation="vertical" > 6 7 <TextView 8 android:layout_width="fill_parent" 9 android:layout_height="wrap_content" 10 android:text="@string/hello" /> 11 12 </LinearLayout>
第二步;编写layoutTabActivity.java文件,具体解释都注释在代码里
1 package cn.edu.zwu.tel; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 import android.app.TabActivity; 6 import android.os.Bundle; 7 import android.view.View; 8 import android.widget.ArrayAdapter; 9 import android.widget.ListView; 10 import android.widget.TabHost; 11 12 //TabContentFactory的意思是当某一选项卡被选中时生成选项卡的内容. 13 //如果你的选项卡的内容按某些条件来生成, 请使用该接口.例如:不显示既存的视图而是启动活动. 14 public class LayoutTab02Activity extends TabActivity implements TabHost.TabContentFactory { 15 16 @Override 17 public void onCreate(Bundle savedInstanceState) 18 { 19 super.onCreate(savedInstanceState); 20 TabHost th = getTabHost(); 21 //newTabSpecd的作用是获取一个新的 TabHost.TabSpec,并关联到当前 TabHost 22 //setIndicator的作用是指定标签和图标作为选项卡的指示符. 23 //setContent的作用是指定用于显示选项卡内容的视图 ID. 24 th.addTab(th.newTabSpec("all").setIndicator("所有通话记录").setContent(this)); 25 th.addTab(th.newTabSpec("ok").setIndicator("已接来电").setContent(this)); 26 th.addTab(th.newTabSpec("cancel").setIndicator("未接来电").setContent(this)); 27 } 28 //创建选项卡内容的回调函数. 29 public View createTabContent(String tag) 30 { 31 ListView lv = new ListView(this); 32 List<String> list = new ArrayList<String>(); 33 list.add(tag); 34 if(tag.equals("all")) 35 { 36 list.add("tom"); 37 list.add("kite"); 38 list.add("rose"); 39 }else if(tag.equals("ok")) 40 { 41 list.add("tom"); 42 list.add("kite"); 43 }else 44 { 45 list.add("rose"); 46 } 47 48 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 49 android.R.layout.simple_list_item_checked, list); 50 lv.setAdapter(adapter); 51 return lv; 52 } 53 }
效果图:
第一种:继承TabActivity,从TabActivity中用getTabHost()方法获取TabHost。只要定义具体Tab内容布局就行了.
- <?xml version="1.0" encoding="utf-8"?>
- <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/FrameLayout01"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content">
- <TextView
- android:id="@+id/TextView01"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="所有通话记录"></TextView>
- <TextView
- android:id="@+id/TextView02"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="已接来电"></TextView>
- <TextView
- android:id="@+id/TextView03"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="未接来电"></TextView>
- </FrameLayout>
- package com.example.testtabhost;
- import android.app.TabActivity;
- import android.os.Bundle;
- import android.view.LayoutInflater;
- import android.widget.TabHost;
- import android.widget.Toast;
- import android.widget.TabHost.OnTabChangeListener;
- public class MainActivity extends TabActivity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- TabHost th = getTabHost();
- //声明TabHost,然后用LayoutInflater过滤出布局来,给TabHost加上含有Tab页面的FrameLayout
- //from(this)从这个TabActivity获取LayoutInflater
- //R.layout.main 存放Tab布局
- //通过TabHost获得存放Tab标签页内容的FrameLayout
- //是否将inflate 拴系到根布局元素上
- LayoutInflater.from(this).inflate(R.layout.activity_main, th.getTabContentView(), true);
- //通过TabHost获得存放Tab标签页内容的FrameLayout,
- //newTabSpecd的作用是获取一个新的 TabHost.TabSpec,并关联到当前 TabHost
- //setIndicator的作用是指定标签和图标作为选项卡的指示符.
- //setContent的作用是指定用于显示选项卡内容的视图 ID.
- th.addTab(th.newTabSpec("all").setIndicator("所有通话记录", getResources().getDrawable(R.drawable.ic_launcher)).setContent(R.id.TextView01));
- th.addTab(th.newTabSpec("ok").setIndicator("已接来电",getResources().getDrawable(R.drawable.ic_launcher)).setContent(R.id.TextView02));
- th.addTab(th.newTabSpec("cancel").setIndicator("未接来电",getResources().getDrawable(R.drawable.ic_launcher)).setContent(R.id.TextView03));
- //setOnTabChangeListener的作业是注册一个回调函数,当任何一个选项卡的选中状态发生改变时调用.
- th.setOnTabChangedListener(
- new OnTabChangeListener() {
- @Override
- public void onTabChanged(String tabId) {
- Toast.makeText(MainActivity.this, tabId, Toast.LENGTH_LONG).show();
- }
- }
- );
- }
- }
第二种:不用继承TabActivity,在布局文件中定义TabHost即可,但是TabWidget的id必须是
@android:id/tabs,FrameLayout的id必须是@android:id/tabcontent。TabHost的id可以自定义.
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/hometabs"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <TabHost android:id="@+id/tabhost"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content">
- <LinearLayout
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <TabWidget android:id="@android:id/tabs"
- android:orientation="horizontal"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content">
- </TabWidget>
- <FrameLayout android:id="@android:id/tabcontent"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content">
- <TextView android:id="@+id/view1"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"/>
- <TextView android:id="@+id/view2"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"/>
- <TextView android:id="@+id/view3"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"/>
- </FrameLayout>
- </LinearLayout>
- </TabHost>
- </LinearLayout>
- package com.example.testtabhost2;
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.Log;
- import android.widget.TabHost;
- import android.widget.TabWidget;
- public class MainActivity extends Activity {
- private static final String TAG = "MainActivity";
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- TabHost tabHost = (TabHost) findViewById(R.id.tabhost);
- tabHost.setup();
- TabWidget tabWidget = tabHost.getTabWidget();
- tabHost.addTab(tabHost.newTabSpec("tab1")
- .setIndicator("tab1", getResources().getDrawable(R.drawable.ic_launcher))
- .setContent(R.id.view1));
- tabHost.addTab(tabHost.newTabSpec("tab3")
- .setIndicator("tab3")
- .setContent(R.id.view3));
- tabHost.addTab(tabHost.newTabSpec("tab2")
- .setIndicator("tab2")
- .setContent(R.id.view2));
- final int tabs = tabWidget.getChildCount();
- Log.i(TAG, "***tabWidget.getChildCount() : " + tabs);
- final int tabWidth = 90;
- final int tabHeight = 45;
- for (int i = 0; i < tabs; i++) {
- /* final View view = tabWidget.getChildAt(i);
- view.getLayoutParams().width = tabWidth;
- view.getLayoutParams().height = tabHeight;
- final TextView tv = (TextView) view.findViewById(android.R.id.title);
- tv.setTextColor(this.getResources().getColorStateList(android.R.color.black));
- MarginLayoutParams tvMLP = (MarginLayoutParams)tv.getLayoutParams();
- tvMLP.bottomMargin = 8;*/
- }
- }
- }