android TabHost小结

本文介绍如何使用自定义XML布局实现TabHost,并将其置于屏幕底部。通过RadioGroup和RadioButton组件结合TabHost,实现了标签页的切换功能。文章还提供了解决AlertDialog和ProgressDialog在嵌套TabActivity中出现的问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TabHost是整个Tab的容器,包括两部分,TabWidget和FrameLayout。TabWidget就是每个tab的标签,FrameLayout则是tab内容。

1、如果我们使用extends TabAcitivty,如同ListActivity,TabHost必须设置为@android:id/tabhost
2、TabWidget必须设置android:id为@android:id/tabs
3、FrameLayout需要设置android:id为@android:id/tabcontent
4、参考这儿:http://blog.youkuaiyun.com/flowingflying/archive/2011/04/06/6304289.aspx

先自定义一个xml文件:

<?xml version="1.0" encoding="utf-8"?>
<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:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1.0"
android:paddingBottom="53px"/>
<TabWidget
android:id="@android:id/tabs"
android:layout_alignParentBottom="true"
android:layout_width="fill_parent"
android:layout_height="50px"
android:visibility="gone"
android:layout_weight="0.0"/>
<RadioGroup
android:gravity="center_vertical"
android:orientation="horizontal"
android:id="@+id/main_radio"
android:background="@drawable/radiogroup_background"
android:layout_width="fill_parent"
android:layout_height="50dip"
android:layout_gravity="bottom">
<RadioButton
android:id="@+id/main_index_button"
android:layout_marginTop="1.0dip"
android:layout_marginRight="5dip"
android:text="@string/main_name"
android:drawableTop="@drawable/unistall"
style="@style/main_tab_bottom"
android:background="@drawable/radio_bg"/>
<RadioButton
android:id="@+id/main_running_button"
android:layout_marginTop="1.0dip"
android:layout_marginRight="5dip"
android:text="@string/run_manager_name"
android:drawableTop="@drawable/unistall"
style="@style/main_tab_bottom"
android:background="@drawable/radio_bg"/>
<RadioButton
android:id="@+id/main_uninstall_button"
android:layout_marginTop="1.0dip"
android:text="@string/uninstall_manager_name"
android:drawableTop="@drawable/unistall"
style="@style/main_tab_bottom"
android:background="@drawable/radio_bg"/>
</RadioGroup>
</LinearLayout>
</TabHost>

为了让tabHost显示在下方,要将RadioGroup的layout_gravity设置为bottom,再将FrameLayout的layout_weight设置为1,这样就可以将RadioGroup撑到最下方。style="@style/main_tab_bottom"里面定义了样式文件。

接下来就是在activity中初始化并添加tabhost:

tabHost = (TabHost) findViewById(android.R.id.tabhost);
tabHost.addTab(Constant.tabHost.newTabSpec("Main")
.setIndicator(getString(R.string.main_name),null)
.setContent(new Intent(this, Main.class)));
tabHost.addTab(Constant.tabHost.newTabSpec("RunManager")
.setIndicator(getString(R.string.run_manager_name),null)
.setContent(new Intent(this, RunManager.class)));
tabHost.addTab(Constant.tabHost.newTabSpec("UninstallManager")
.setIndicator(getString(R.string.uninstall_manager_name),null)
.setContent(new Intent(this, UninstallManager.class)));


初始化每个RadioButton并为其添加setOnCheckedChangeListener事件,当点击相应的RadioButton时就可以通过setCurrentTabByTag()方法显示到当前页面。

private void initRadios() {
((RadioButton) findViewById(R.id.main_index_button))
.setOnCheckedChangeListener(this);
((RadioButton) findViewById(R.id.main_running_button))
.setOnCheckedChangeListener(this);
((RadioButton) findViewById(R.id.main_uninstall_button))
.setOnCheckedChangeListener(this);
}

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked){
switch (buttonView.getId()) {
case R.id.main_index_button:
tabHost.setCurrentTabByTag("Main");
break;
case R.id.main_running_button:
tabHost.setCurrentTabByTag("RunManager");
break;
case R.id.main_uninstall_button:
tabHost.setCurrentTabByTag("UninstallManager");
break;
}
}
}


小结:
1、在一个tabActivity里面嵌套一个tabAcitivity, 如果在子tabActivity里面显示AlertDialog、ProgressDialog的话,就会引发此错误:android.view.WindowManager$BadTokenException: Unable to add window

解决方法:
可以把创建dialog时传递的参数xxx.this改成this.getParent(),其中的xxx为Activity
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值