tabwidget类似于android 中查看电话薄的界面,通过多个标签切换显示不同内容。要实现这一效果,首先要了解tabhost,它是一个用来存放多个tab标签的容器。每一个tab都可以对应自己的布局,比如,电话薄中的tab布局就是一个list的线性布局了。
要使用tabhost,首先需要通过gettabhost方法来获取tabhost的对象,然后通过addtab方法来向tabhost中添加 tab。当然每个tab在切换时都会产生一个事件,要捕捉这个事件需要设置tabactivity的事件监听 setontabchangedlistener。
1、布局文件
- <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" >
- <linearlayout
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <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" >
- <textview
- android:id="@+id/textview1"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:text="linux"
- android:textcolor="#ff0000" />
- <textview
- android:id="@+id/textview2"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:text="mac"
- android:textcolor="#385e0f" />
- <textview
- android:id="@+id/textview3"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:text="windows"
- android:textcolor="#1e90ff" />
- </framelayout>
- </linearlayout>
- </tabhost>
2、修改mainactivity,注意是继承自tabactivity
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
public class mainactivity extends tabactivity { private tabhost tabhost; @override protected void oncreate(bundle savedinstancestate) { super .oncreate(savedinstancestate); setcontentview(r.layout.activity_main); tabhost = gettabhost(); addtab(); // 添加标签 // 设置tabhost背景颜色 tabhost.setbackgroundcolor(color.argb( 150 , 20 , 80 , 150 )); // 设置tabhost背景图片资源 tabhost.setbackgroundresource(r.drawable.ic_launcher); // 设置当前显示哪一个标签 我的理解就是当你第一次启动程序默认显示那个标签 这里是指定的选项卡的id从0开始 tabhost.setcurrenttab( 0 ); // 标签切换事件处理,setontabchangedlistener 注意是标签切换事件不是点击事件,而是从一个标签切换到另外一个标签会触发的事件 tabhost.setontabchangedlistener( new ontabchangelistener() { @override public void ontabchanged(string tabid) { alertdialog.builder builder = new alertdialog.builder(mainactivity. this ); dialog dia; builder.settitle( "提示" ); builder.setmessage( "当前选中了" + tabid + "标签" ); builder.setpositivebutton( "确定" , new onclicklistener() { @override public void onclick(dialoginterface dialog, int which) { dialog.cancel(); } }); dia = builder.create(); dia.show(); } }); } // 为tabhost添加标签 新建一个newtabsped(new tabspec) 设置其标签和图标(setindicator)、设置内容(setcontent) // tabspec是tabhost的内部类 tabhost对象的 newtabspec()方法返回一个tabspec对象 // 源码里边是这么写的 public tabspec newtabspec(string tag) // { return new tabspec(tag); } private void addtab() { tabhost.addtab(tabhost .newtabspec( "tab1" ) .setindicator( "tab1" , getresources().getdrawable(r.drawable.ic_launcher)) // setindicator()此方法用来设置标签和图表 .setcontent(r.id.textview1)); // 指定内容为一个textview --->public tabhost.tabspec setcontent(int viewid) 此方法需要一个 viewid 作为参数 tabhost.addtab(tabhost .newtabspec( "tab2" ) .setindicator( "tab2" , getresources().getdrawable(r.drawable.ic_launcher)) .setcontent(r.id.textview2)); tabhost.addtab(tabhost .newtabspec( "tab3" ) .setindicator( "tab3" , getresources().getdrawable(r.drawable.ic_launcher)) .setcontent(r.id.textview3)); } } |
3、运行程序:如下!