`
tibaloga
  • 浏览: 873696 次
文章分类
社区版块
存档分类
最新评论

【Android进阶】嵌套TabHost (TabHost中放TabHost,类似二级目录、二级树)

 
阅读更多

今天讲一下,如何在TabHost中,再放TabHost。

先来看一下效果。

一层TabHost

两层Tabhost (内部TabHots在上面)

两层TabHost (内层TabHots在下面)

下面说一下代码,一共3个 java类,3个xml布局文件。

看一下主画面:

main.xml

就是常规的Tabhost布局。

入口类:

DoubleTabHost.java

对于TabHost、布局文件中必须包含TabHost、TabWidget 、FrameLayout .缺一不可

如果加载该TabHost画面的类继承TabActivity,并且想通过getTabHost()方法来获取TabHost,getTabWidget()方法获取TabWidget,

那么TabHost、TabWidget 、FrameLayout三者的ID必须是android.R.id.tabhost、android.R.id.tabs、android.R.id.tabcontent

否则会报运行时异常,错误如下:

TabHost ID错误:

TabWidget ID 错误:

FrameLayout ID错误:

子TabHost页面:

subtab.xml

子TabHost页面加载类:

SubTab.java

如果加载TabHost画面的继承自Activity,可以通过findViewById来获取这三个组件,此时ID可自定义。

需要注意的是,此时必须调用setup方法来加载TabHost。

对了,不要忘了在AndroidManifest.xml定义Activity~~呵呵!

要点就这么多~ 就这样了。

源码我会上传,地址稍后给出。

源程序下载地址: http://download.csdn.net/source/3037680


BUG对应。 感谢simayilonggz116提出这两个典型问题。

问题一:无法在子tabhost中打开Activity。

解决办法1:

1. 将初始化tabHost的那个类(此例中为SubTab类),继承ActivityGroup,而不是Activity

2. tabhost.setup() 改为tabHost.setup(this.getLocalActivityManager());

具体参考:

http://stackoverflow.com/questions/3272500/android-exception-did-you-forget-to-call-public-void-setup-localactivitymanage

http://hi.baidu.com/ljlkings/blog/item/47f1afdbdcd27de638012f76.html

解决办法2:

也可以将SubTab类改继承TabActivity,然后布局文件中Tabhost的id改为@android:id/tabhost.

因为TabActivity也是继承自ActivitGroup的。

以上两种方法都可以。

问题二: TabHost 嵌套后,Dialog 不能显示

解决办法:

AlertDialog.Builder(xxx.this) =>AlertDialog.Builder(xxx.this.getParent())

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics