Android下使用TabHost和与Tab对应的Menu

在新建Android项目时,并没有建立Tab项目的选项,因此需要做一定的改动,即将基类Activity修改为TabActivity。
代码看起来像这样:
public class TabDemo extends TabActivity implements OnTabChangeListener

然后需要在layout里,修改布局方式为FrameLayout。这种布局方式将允许有子布局的存在,这就对应了TabActivity的布局方式。在TabHost内,每个将会存在的页签都对应了FrameLayout下的一个具体Layout。xml写法如下:
<?xml version= "1.0" encoding= "utf-8"?>
< FrameLayout xmlns:android= "http://schemas.android.com/apk/res/android"
android:layout_width= "fill_parent" android:layout_height= "fill_parent">
< LinearLayout android:id= "@+id/tab1"
android:layout_width= "fill_parent" android:layout_height= "fill_parent"
androidrientation= "vertical" >
</ LinearLayout>
< LinearLayout android:id= "@+id/tab2"
android:layout_width= "fill_parent" android:layout_height= "fill_parent"
androidrientation= "vertical"  >
</ LinearLayout>
< LinearLayout android:id= "@+id/tab3"
android:layout_width= "fill_parent" android:layout_height= "fill_parent"
androidrientation= "vertical">
</ LinearLayout>
</ FrameLayout>

在每一个内部的LinearLayout下,可以按常规的设计方法去放置界面组件,在此不赘述
然后,通过代码即可将Layout分布到各个Tab上面去
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tabHost = this.getTabHost();
LayoutInflater.from( this).inflate(R.layout.main,
tabHost.getTabContentView(), true);
tab1 = tabHost.newTabSpec( "Id1").setIndicator( "Tab1",
this.getResources().getDrawable(R.drawable.icon)).setContent(
R.id.tab1);
tabHost.addTab(tab1);
tab2 = tabHost.newTabSpec( "Id2").setIndicator( "Tab2",
this.getResources().getDrawable(R.drawable.icon)).setContent(
R.id.tab2);
tabHost.addTab(tab2);
tab3 = tabHost.newTabSpec( "Id3").setIndicator( "Tab3",
this.getResources().getDrawable(R.drawable.icon)).setContent(
R.id.tab3);
tabHost.addTab(tab3);
tabHost.setOnTabChangedListener( this);
}

在此设置了一个OnTabChangedListener,用于监听当页签选择改变的事件,代码如下:
@Override
public void onTabChanged(String tabId) {
new AlertDialog.Builder( this).setTitle( "Hint").setMessage(tabId)
.setPositiveButton( "OK", null).show();
}
此处为了方便起见,只对当前页签的Id做了个显示,没有其他功能,在实际开发中,可以针对不同的页签做出各种不同处理

到此为止,页签的显示就完成了,下面就需要实现与页签对应的不同菜单。首先依然是编写xml,将菜单写成xml方便使用。当然也可以用代码也构造菜单,不过那样较为麻烦。
<?xml version= "1.0" encoding= "utf-8"?>
< menu
xmlns:android= "http://schemas.android.com/apk/res/android">
< item android:title= "Tab1 M1" android:id= "@+id/mntab11"></ item>
< item android:title= "Tab1 M2" android:id= "@+id/mntab12"></ item>
< item android:title= "Tab1 M3" android:id= "@+id/mntab13"></ item>
</ menu>

这里节省篇幅,只写出了一个Tab所对应的菜单,其他Tab对应的菜单也是通过类似的xml可以写出
然后就可以覆盖onPrepareOptionsMenu()方法并将菜单关联到每一个Tab
private int[] tabMenus = { R.menu.mntab1, R.menu.mntab2, R.menu.mntab3 };
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
menu.clear();
MenuInflater inflater = getMenuInflater();
switch (tabHost.getCurrentTab()) {
case 0:
inflater.inflate(tabMenus[0], menu);
break;
case 1:
inflater.inflate(tabMenus[1], menu);
break;
case 2:
inflater.inflate(tabMenus[2], menu);
break;
default:
break;
}
return super.onCreateOptionsMenu(menu);
}

这样就实现了一个带有对应菜单的TabActivity,程序运行截图如下所示:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值