tabhost tab studio example espaƱol ejemplo control activity android android-tabhost

studio - tabitem android



Android: TabHost sin TabActivity (4)

Quiero crear pestañas 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

<?xml version="1.0" encoding="utf-8"?> <TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/tabhost" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:paddingTop="5dip"> <TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" android:layout_height="fill_parent"></TabWidget> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="fill_parent" android:layout_height="fill_parent" android:paddingTop="5dip"> </FrameLayout> </LinearLayout> </TabHost>

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

¡Gracias!


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


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 pestañas. Esto no solo dará como resultado menos código, menos espacio en el montón consumido, menos espacio en la pila consumida y menor utilización de la CPU, sino que también le permitirá superar este problema. Aquí hay two examples 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()); } }