Android: TabHost sin TabActivity

Quiero crear tabs sin ampliar TabActivity. (La razón es que TabActivity no puede manejar una barra de título personalizada como parece). yo tengo

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

}

El error que obtengo es

  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. 

El xml para la vista es

         

Leí en alguna parte que tengo que usar un LocalActivityManager, supongo que me falta algo allí. Alguien una idea?

¡Gracias!

Antes de llamar a tabHost.setup (mLocalActivityManager); necesitas agregar esta linea

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

Del mismo modo, debe agregar para onResume,

 mlam.dispatchResume(); 

onPause (),

  mlam.dispatchPause(isFinishing()); 

Considere usar Views como el contenido de sus tabs. Esto no solo dará como resultado menos código, menos espacio en el montón consumido, menos espacio en la stack consumida y menor utilización de la CPU, sino que también le permitirá superar este problema. Aquí hay dos ejemplos que muestran esta técnica.

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

A pesar de las consideraciones de diseño, lo siguiente no funciona en absoluto, y la API parece indicar que setContent(Intent i) es válido. Esto funciona cuando la actividad amplía TabActivity , sin embargo, al extender la Activity y agregar setup() resultados de la llamada a la setup() produce una exception at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:649)

Lo curioso es que el LogCat sugiere que olvidé llamar a 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));