android.app包中含有一个activitygroup类,该类是activity的容器,可以包含多个嵌套进来的activitys,这篇文章就是借助activitygroup可以嵌套activity的功能来实现tab功能。tab这种ui在很多的移动应用中可以看到,包括android、iphone、window phone7等移动终端上都有这样的应用,tab这种ui方式具有小视图大容量的特点。
首先,从sdk中doc文档中都可以获知,activitygroup类的父类是activity(见下图),也就是说二者具有相同的接口和生命周期,同activity一样,也有oncreate()、onpause()等函数可供我们重载。
activitygroup中有两个public方法(下图):activitygroup中可以调用getlocalactivitymanage()方法获取localactitymanage来管理activity。
activitygroup实现的tab功能的效果图如下。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLi8CXlx2YpRnch9CXt92Yu4Wd5lGbh5iclB3bsVmdlR2Lc9CX6MHc0RHaiojIsJye.jpg)
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLi8CXlx2YpRnch9CXt92Yu4Wd5lGbh5iclB3bsVmdlR2Lc9CX6MHc0RHaiojIsJye.jpg)
先看一下java代码:
public class mainview extends activitygroup {
@suppresswarnings("unused")
private linearlayout bodyview,headview;
private linearlayout one, two, three, four;
private int flag = 0; // 通过标记跳转不同的页面,显示不同的菜单项
/** called when the activity is first created. */
@override
public void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.view_main);
initmainview();
// 显示标记页面
showview(flag);
one.setonclicklistener(new onclicklistener() {
public void onclick(view v) {
// todo auto-generated method stub
flag = 0;
showview(flag);
}
});
two.setonclicklistener(new onclicklistener() {
flag = 1;
}
three.setonclicklistener(new onclicklistener() {
flag = 2;
four.setonclicklistener(new onclicklistener() {
public void onclick(view v) {
flag = 3;
showview(flag);
}
/*
* 初始化主界面
*/
public void initmainview() {
headview=(linearlayout) findviewbyid(r.id.head);
bodyview=(linearlayout) findviewbyid(r.id.body);
one=(linearlayout) findviewbyid(r.id.one);
two=(linearlayout) findviewbyid(r.id.two);
three=(linearlayout) findviewbyid(r.id.three);
four=(linearlayout) findviewbyid(r.id.four);
}
// 在主界面中显示其他界面
public void showview(int flag) {
switch (flag) {
case 0:
bodyview.removeallviews();
view v = getlocalactivitymanager().startactivity("one",
new intent(mainview.this, oneview.class)).getdecorview();
one.setbackgroundresource(r.drawable.frame_button_background);
two.setbackgroundresource(r.drawable.frame_button_nopressbg);
three.setbackgroundresource(r.drawable.frame_button_nopressbg);
four.setbackgroundresource(r.drawable.frame_button_nopressbg);
bodyview.addview(v);
break;
case 1:
bodyview.addview(getlocalactivitymanager().startactivity("two",
new intent(mainview.this, twoview.class))
.getdecorview());
one.setbackgroundresource(r.drawable.frame_button_nopressbg);
two.setbackgroundresource(r.drawable.frame_button_background);
case 2:
bodyview.addview(getlocalactivitymanager().startactivity(
"three", new intent(mainview.this, threeview.class))
three.setbackgroundresource(r.drawable.frame_button_background);
case 3:
"four", new intent(mainview.this, fourview.class))
four.setbackgroundresource(r.drawable.frame_button_background);
default:
}
}
程序中重要的是如下的方法:
bodyview.removeallviews();
bodyview.addview(getlocalactivitymanager().startactivity("two",
new intent(mainview.this, twoview.class))
.getdecorview());
使用view的removeallviews()方法清除不需要的view,使用addview(view v)方法添加需要的view。
getlocalactivitymanager().startactivity("two",new intent(mainview.this, twoview.class))得到一个window对象,window对象调用
getdecorview()获取view。关于window的方法可以参考android.app.window。
通过tab的效果图可以看到这个效果使用了上、中、下三种布局,layout就可以这样做了。实现layout就可以实现tab功能了。