2011-03-23 55 views
4

我對Honeycomb的向後兼容性有疑問。我有一個支持2.1或更高版本的應用程序,似乎主要在Honeycomb上工作,除非他們啓動TabActivity。Honeycomb和TabHost規格

特別是,當我添加標籤到TabHost,我得到下面的異常

android.content.res.Resources $ NotFoundException:資源編號爲0x0

當拋出這個代碼看例外,我看到它是帶有標籤和圖標的選項卡規範。在代碼內部,LabelAndIconIndicatorStrategy會嘗試膨脹佈局文件R.layout.tab_indicator,該文件看起來不可用。

TabHost.TabSpec spec; // Resusable TabSpec for each tab 
    Intent intent; // Reusable Intent for each tab 

    // Create an Intent to launch an Activity for the tab (to be reused) 
    intent = new Intent().setClass(_gameActivity, ScoreGameActivity.class); 
    intent.putExtra(GameChangerConstants.STREAM_ID, _stream.pk().toString()); 

    // Initialize a TabSpec for each tab and add it to the TabHost 
    spec = _gameTabHost.newTabSpec("score_game").setIndicator("Score", res.getDrawable(R.drawable.icon_field_gloss)).setContent(intent); 
    _gameTabHost.addTab(spec); 

有沒有一種新的方式來創建我不知道的蜂窩標籤?我傾注了文檔,但沒有看到任何表明我所做的事情存在問題的東西。

我想避免在此時使用片段,直到我們可以對UI小部件進行更全面的重構,並且希望更好地理解此問題。

+0

發佈你的logcat異常。我最近必須處理v2.1之間和TabActivity相關的問題。它可能不一樣,但值得一看。 – Squonk 2011-03-23 16:43:44

+0

標籤在Honeycomb上正常工作。這些示例項目在XOOM上都可以正常工作:https://github.com/commonsguy/cw-android/tree/master/Fancy/Tab https://github.com/commonsguy/cw-android/tree/master/Fancy/DynamicTab https://github.com/commonsguy/cw-android/tree/master/Activities/IntentTab – CommonsWare 2011-03-23 17:18:45

+0

@MisterSquonk不太清楚你想看多少,所以這裏是鏈接到一個pastie [鏈接] http:///pastie.org/1704756[/link] – sparky 2011-03-23 17:24:30

回答

14

我相信我已經找到了解決辦法,但由於人們很好奇,這裏是我的時候我就遇到了這個問題的堆棧跟蹤:

05-17 13:09:53.462: ERROR/CustomExceptionHandler(500): Uncaught throwable in thread Thread[main,5,main] 
    android.content.res.Resources$NotFoundException: Resource ID #0x0 
    at android.content.res.Resources.getValue(Resources.java:1014) 
    at android.content.res.Resources.loadXmlResourceParser(Resources.java:2039) 
    at android.content.res.Resources.getLayout(Resources.java:853) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:389) 
    at android.widget.TabHost$LabelAndIconIndicatorStrategy.createIndicatorView(TabHost.java:568) 
    at android.widget.TabHost.addTab(TabHost.java:226) 
    at com.myApp.ui.TabDialog.addTab(TabDialog.java:80) 
    ... 

在那行,我有一些代碼大致相當於什麼斯帕克看到:

spec = myTabHost.newTabSpec("score_game").setIndicator("Score", res.getDrawable(R.drawable.icon_field_gloss)).setContent(intent); 
myTabHost.addTab(spec); 

注意myTabHost是TabHost和spec是則tabspec。

以前,我被初始化myTabHost這樣的:

//WRONG - This can CRASH your app starting at Android SDK 3.0 
TabHost myTabHost = new TabHost(getContext()); 

要解決這個問題,我就開始做這個初始化TabHost:

TabHost myTabHost = new TabHost(getContext(), null); 

這定了!我很想找到根本原因,但我還沒有弄明白。

+0

謝謝取消。我實際上只是繼續前進,並將所有標籤主機初始化移動到似乎解決了問題的xml佈局資源中,但很高興知道有一個解決方案。 – sparky 2011-05-24 13:02:25

+0

@plowman謝謝。這通過調用AttributeSet的構造函數來解決我的問題。關於你的問題,原因是單個param構造函數不調用this(context,null,com.android.internal.R.attr.tabWidgetStyle),而是調用super(ctx),因此很多事情都沒有初始化,需要在TabHost上 – Sileria 2015-01-25 20:46:23