Android: TabHost sans TabActivity

Je veux créer des tabs sans étendre TabActivity. (La raison en est que TabActivity ne peut pas gérer une barre de titre personnalisée comme il semble). j’ai

public class startTab extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mylayout); Resources res = getResources(); LocalActivityManager mlam = new LocalActivityManager(this, false); TabHost tabHost = (TabHost) findViewById(R.id.tabhost); tabHost.setup(mlam); TabHost.TabSpec spec; Intent intent; intent = new Intent().setClass(this, Show1.class); spec = tabHost.newTabSpec("Items").setIndicator("Items", res.getDrawable(R.drawable.items32_ldpi)).setContent(intent); tabHost.addTab(spec); intent = new Intent().setClass(this, Show2.class); spec = tabHost.newTabSpec("Users").setIndicator("Users",res.getDrawable(R.drawable.user32_ldpi)).setContent(intent); tabHost.addTab(spec); } 

}

L’erreur que je reçois est

  07-02 07:11:12.715: ERROR/AndroidRuntime(411): Caused by: java.lang.IllegalStateException: Activities can't be added until the containing group has been created. 

Le xml pour la vue est

         

J’ai lu quelque part que je devais utiliser un LocalActivityManager, je suppose que quelque chose me manque. Quelqu’un a une idée?

Merci!

Avant d’appeler tabHost.setup (mLocalActivityManager); vous devez append cette ligne.

 mlam.dispatchCreate(savedInstanceState); tabHost.setup(mlam ); 

de même, vous devez append pour onResume,

 mlam.dispatchResume(); 

onPause (),

  mlam.dispatchPause(isFinishing()); 

Veuillez envisager d’utiliser Views comme contenu de vos tabs. Non seulement cela se traduira par moins de code, un espace de stack moins consommé, un espace de stack moins consommé et une utilisation moindre du processeur, mais cela vous permettra également de résoudre ce problème. Voici deux exemples montrant cette technique.

 public class ScoreboardActivity extends Activity { LocalActivityManager mlam; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_scoreboard); mlam = new LocalActivityManager(this, false); mlam.dispatchCreate(savedInstanceState); TabHost th = (TabHost) findViewById(android.R.id.tabhost); th.setup(mlam); th.addTab(th.newTabSpec("Numpad").setIndicator("Numpad").setContent(R.id.tab1)); th.addTab(th.newTabSpec("CardCount").setIndicator("CardCount").setContent(R.id.tab2)); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_scoreboard, menu); return true; } @Override protected void onResume(){ super.onResume(); mlam.dispatchResume(); } @Override protected void onPause(){ super.onPause(); mlam.dispatchPause(isFinishing()); } } 

Malgré les considérations de conception, les éléments suivants ne fonctionnent pas du tout et l’API semble indiquer que setContent(Intent i) est valide. Cela fonctionne lorsque l’activité étend TabActivity , cependant, l’extension de l’ Activity et l’ajout setup() appel à setup() entraînent une exception at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:649)

Ce qui est drôle, c’est que le LogCat suggère que j’ai oublié d’appeler setup()

 mTabHost = (TabHost) findViewById(android.R.id.tabhost); mTabHost.setup(); Intent tab1Intent = new Intent(this, ActivityOne.class); Button tab1View = new Button(this); tab1View.setText("Activity 1"); mTabHost.addTab(mTabHost.newTabSpec("tab_1").setIndicator(tab1View).setContent(tab1Intent));