頁籤(TabHost)在行動APP中扮演了很重要的角色,由於手機的畫面比較小,因此如果有很多功能需要提供給使用者,不太可能全部擠在同一個頁面,因此頁籤功能可以讓使用者有比較好的體驗,讓使用者操作起來就像在「同一個頁面」,要切換功能也比較方便。但Google TabHost找到的範例大多是使用TabActivity來操作TabHost,而官網已經明確的指出TabActivity這個類別已經過期(deprecated)。

This class is deprecated.
New applications should use Fragments instead of this class; to continue to run on older devices, you can use the v4 support library which provides a version of the Fragment API that is compatible down to DONUT.

照著上面官網所提到的可以透過Fragments來取代TabActivity的功能。

為了避免「我的股票精算師」往後也會面臨到這種困擾,小蛙開始找有沒有替代方案,既然過期的是TabActivity,TabActivity是繼承ActivityGroup,而ActivityGroup又是繼承Activity,那應該有可能將TabHost放置在Activity中吧?Google上發現的確有高手分享相關文章,小蛙就以「最少修改」的方式進行「我的股票精算師」修改,其實把TabActivity用Activity取代並不難,但是不知道從何修改起,也不知道問題到底在哪,從官方的TabActivity原始碼中應該可以看出一些端倪,看來要增進自己的能力還是必須要多看官方原始碼才行。

不廢話了,直接進程式碼吧!TabHost的使用方法小蛙就不再另外說明了,Google一下就有很多。這裡直接說明要修改的部分。小蛙參考了Stack Overflow這篇文章,建立TabHost的方始與使用TabActivity時完全相同,要修改部分如下(上面是原始版本,下面是修改過後的版本):

1. 把TabActivity改成Activity(廢話 …)

public class MainActivity extends TabActivity
public class MainActivity extends Activity

2. 取得TabHost物件,這裡不能透過像TabActivity一樣直接用getTabHost();。

TabHost tabHost = getTabHost();
TabHost tabHost = (TabHost)findViewById(android.R.id.tabhost);

3. 增加一個LocalActivityManager物件。這幾行是一定不能少,少了對大家都不好DDMS會一直報出大量的錯誤訊息。

LocalActivityManager lam = new LocalActivityManager(MainActivity.this, false);
lam.dispatchCreate(savedInstanceState);
mHost.setup(lam);

4. 最後最重要的重頭戲部份Override onPause及onResume(這個應該是有看過Source的人才知道的吧!小蛙太弱了><),少了這邊的設定,就算上面全部都對,到這邊還是會狂錯(感謝Stack Overflow的dcanh121以及CJ Villa)。

@Override
protected void onPause() {
    lam.dispatchPause(isFinishing());
    super.onPause();
}
@Override
protected void onResume() {
    lam.dispatchResume();
    super.onResume();
}

如果有任何一個步驟漏掉,會得到以下錯誤。

Caused by: java.lang.IllegalStateException: Activities can't be added until the containing group has been created.

到這邊就已經完成囉!其他tabHost.addTab的使用方式一模一樣。接下來會再另一篇說明怎麼在TabHost裡面切換多個Activity,並且讓每個頁籤中的Back Stack可以獨立運作。

相關文章

Android Tabhost with FragmentActivity

(2013-01-30 更新) 接續Android TabHost
2012-02-29 23:26:55
hans

18

Android TabHost中切換Activity

(2013-04-15 更新)上一篇文章Android TabHost Without TabActivity
2012-02-25 15:03:29
hans

18

SSL For Free – 免費又有綠色鎖頭的 SSL Certificates

之前聽說 Google 會優先搜尋有 https 的網頁 (參考:
2016-07-07 23:00:54
hans

8

Android Vuforia with jPCT-AE (5) – 多重模型載入,以 obj 為例

要進到這系列最後一篇文章了,這篇文章拖了很久,一直沒有時間整理,結果到最後 ... 程式碼留下來了,記憶卻有些模糊了,這邊小蛙配著程式碼盡可能的把還記得的東西寫下來。
2016-07-06 11:24:19
hans

8

Android Vuforia with jPCT-AE (4) – 載入 3DS 測試

延續 jPCT-AE Loader 載入模型的部份,這篇要記錄載入 3ds 檔案格式的方法,基本上跟前面幾個 obj, md2 的方法差不多,只有一些小小的變化而已。
2016-07-06 10:24:33
hans

8

Android Vuforia with jPCT-AE (3) – 載入 md2 測試

前兩篇介紹如何直接透過 jPCT-AE 直接繪圖以及載入 .obj 檔案,這邊繼續介紹 jPCT-AE 載入 md2 的方法,載入動作大致上類似,唯一不同的只有 texture 設定部份。
2016-07-06 09:24:43
hans

8

Android Vuforia with jPCT-AE (2) – 載入 obj 測試

上一篇 Android Vuforia with jPCT-AE (1) –
2016-07-06 08:24:55
hans

8

Android Vuforia with jPCT-AE (1) – 基本範例

說來慚愧,從 Google Adsense 被 ban 之後,就好久沒有發文了,站上 Vuforia 的文章也已經是好久以前的事情了 (遠目),最近有專案要用到 Vuforia,爬以前的文回來看,蛙哩咧 ... 現在已經更新到 Vu
2016-07-06 07:57:58
hans

8

ClickForce (MobiForce) 當機問題

這真是個浪費時間又漫長的過程,CF 推出新版後台以及新版 SDK 的時候,小蛙就下載來測試,一開始小蛙直接套在「我的股票精算師」上,但只要一套上去就當機 ...
2015-09-02 10:32:51
hans

8




  一個回應 to “Android TabHost Without TabActivity”

  1. […] 承上篇文章Android TabHost Without TabActivity,在MainActivity中的TabHost加入頁籤。 […]

 回覆

你可以使用以下語法 HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="">

(required)

(required)

   
© 2012 蛙齋 Suffusion theme by Sayontan Sinha