2011-03-23 5 views
4

J'ai une question sur la rétrocompatibilité de Honeycomb. J'ai une application qui prend en charge 2.1 ou plus et semble fonctionner principalement sur Honeycomb, sauf quand ils commencent une TabActivity.Spécifications nid d'abeille et tabHost

En particulier, quand j'ajoute des onglets à la TabHost, je reçois l'exception suivante

android.content.res.Resources $ NotFoundException: ressource ID # 0x0

Lorsque l'on regarde le code qui jette cette exception, je vois que c'est la spécification de l'onglet qui a une étiquette et une icône. Dans le code, LabelAndIconIndicatorStrategy essaie de gonfler le fichier de disposition R.layout.tab_indicator qui ne semble pas disponible.

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); 

Y at-il une nouvelle façon de créer des onglets pour nid d'abeille que je ne sais pas? J'ai versé sur la documentation, mais je n'ai rien vu qui indique un problème avec ce que j'ai fait. Je voudrais éviter d'avoir à utiliser des fragments à ce stade jusqu'à ce que nous puissions faire une restructuration plus complète de nos widgets de l'interface utilisateur et je voudrais mieux comprendre ce problème.

+0

Postez votre logcat pour l'exception. J'ai dû faire face à un problème récent entre v2.1 et supérieur qui était lié à TabActivity. Ce n'est peut-être pas la même chose, mais ça vaut le coup d'oeil. – Squonk

+0

Les onglets fonctionnent bien sur Honeycomb. Ces exemples de projets fonctionnent tous très bien sur un 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

+0

@MisterSquonk n'était pas tout à fait sûr de ce que vous vouliez voir donc voici le lien vers un pastie [link] http://pastie.org/1704756[/link] – sparky

Répondre

14

Je crois que je l'ai trouvé une solution, mais parce que les gens sont curieux, voici le stacktrace que je suis quand je suis tombé sur ce problème:

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) 
    ... 

A cette ligne, j'ai le code à peu près équivalent à ce que Sparky a vu:

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

Notez que myTabHost est un TabHost et spec est un TabSpec.

Auparavant, je myTabHost comme ceci Initialisation:

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

Pour résoudre ce problème, j'ai commencé à initialiser le TabHost en faisant ceci:

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

Et que le fixe! J'aimerais trouver une cause profonde, mais je n'ai pas encore été capable de le comprendre.

+0

grâce à unchek. En fait, je suis juste allé de l'avant et déplacé toute l'initialisation de l'hôte onglet dans la ressource de mise en page XML qui semble avoir résolu le problème, mais il est bon de savoir qu'il existe une solution. – sparky

+0

@plowman merci. Cela résout mon problème en appelant le constructeur avec null pour le AttributeSet. En ce qui concerne votre question, la raison en est que le seul constructeur de param n'appelle pas cela (context, null, com.android.internal.R.attr.tabWidgetStyle), il appelle à la place super (ctx), donc beaucoup de choses ne sont pas initialisées. nécessaire sur le TabHost – Sileria