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