TabHost的那些事

     这两天在做一个要用到TabHost的东西,做完后感慨万千,中间解决了不少问题,也曾经为一些莫名其秒的报错而搞得焦头烂额,忙完后,一边为自己对抓错分析错误的能力而惭愧,一边又为自己不严谨的编程风格而途生无谓的错误而无奈。所以,在这里就总结一下自己的体会和心得。

     TabHost的实现网上有一大堆教程,也有很多例子可做参考,但是就我的教训来说,其实一开始就不要随便照搬别人的例子,而应该先看android官网上的例子代码,因为其他人的例子有些是自己有变动的但是我们并不清楚,所以不知道到底哪些东西是不需要的,官方的例子好处就是简洁,只告诉你建立一个TabHost所需要的最基本的东西。

上面的就是官方的代码。在用getTabHost()得到TabHost后,要用LayoutInflater来得到layout。LayoutInflater的作用其实和findViewById()类似,但是前者是用来寻找layout文件夹下的xml布局文件,并且实例化,findViewById()相信大家都非常熟悉,就是找到某个xml下的具体控件如按钮等。具体的参数这里不解释,只要上谷歌搜搜就行,这里只讲一些我们容易忽略而导致错误的地方。对于上面其实有一个很容易会犯错的地方,而且也不应该这么写。大家有没有看出来?就是我们经常默认就会加上去的setContentView(R.layout.main)!这句是可以去掉的,因为已经通过LayoutInflater得到布局了,而且我在开始的时候是将我的tab布局命名为main.xml的人,于是我就悲剧了,这时会报什么错误呢?就是NullPointer!如果大家在有关于布局这方面上出现这个错误,就要提个醒,自己的布局文件或控件是否能够切实找到或者重新添加布局文件呢?举个例子,不要以为Spinner s = (Spinner)findViewById(R.id.spinner)就能找到你定义的spinner,尤其是有些人会想要往对话框上添加Spinner而用到AlterDialog时,说清楚点,是因为就像TabHost,我们也需要用到LayoutInflater来获取layout,如:View view = LayoutInflater.from(this).inflater(R.layout.main, null);这时很多人就疏忽大意了,直接写Spinner s = (Spinner)findViewById(R.id.spinner).这时会报NullPointer的错误,至少我就是这样。解决的方法就是这样view.findViewById。因为它无法找到你的布局文件,你已经将它改为view了。所以以后遇到这些问题,就不要再焦头烂额了,我们已经有一个思路了,就是可能是我们的布局或控件出问题,只要找到具体哪里出问题,NullPointer的问题还是很容易就解决的。

      好了,话题错开了,就返回到正题上。

      请注意,上面的代码的Activity是要继承自TabActivity才能这样子写!只有继承自TabActivity才能有getTabHost()这个方法获取TabHost。如果你是想要在Tab中添加activity,也很简单,因为我们有intent。只要这样子改:setContent(new Intent(this, tab1.class))就行了。接下来讨论下如果不是继承自TabActivity呢?

         其实行为都是一样的,只是我们在得到TabHost的时候就没有getTabHost()这个方便的方法了,要这么写:TabHost tabHost = (TabHost)findViewById(R.id.tabhost).很简单吧?哈哈,这样想你就错了,这样子还是会出现问题!我们必须在add(tab1)前加上这一句tabhost.setup()来启动TabHost,否则会出错,就是那个该死的NullPointer!

         到了这里就差不多结束了,我不会将完整的代码贴上来,因为不是什么大牛的教程贴,只是想要将自己的一些心得和教训记录下来而已,所以只要记录自己犯的错误和领悟到的东西就行。嗯,就这样了。如果大家看了后就这样的话,哈哈,回去有些粗心的人可能会郁闷,怎么不行啊!因为在xml中,android对于TabHost是少见的有限制的,就是你的TabHost,TabWidget,FrameLayout的id必须分别为tabhost,tabs,tabcontent来说明你的布局的这些部分是属于TabHost的布局范围,而且交代是干嘛的,因为很多时候我们都会往TabHost上添加其他控件的。

         哈哈,文章至此也就结束,如果你的代码中还是有些莫名其秒的错误,但是代码完全没错,嗯,我也遇到过,就是你的manifest中没有为你的TabActivity注册^-^,你可以看一下是不是,不是的话我也无能为力了~^0^~

原文地址:https://www.cnblogs.com/wenjiang/p/2612747.html