2010-07-02 15 views
42

Quiero crear pestañas sin extendiendo TabActivity. (La razón es que TabActivity no puede manejar una barra de título personalizada como parece). TengoAndroid: TabHost sin TabActivity

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 consigo 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> 

He leído en alguna parte que tengo que usar un LocalActivityManager, Supongo que me falta algo allí. Alguien una idea?

Gracias!

+0

este tutorial podría ayudarle a http://learnncode.wordpress.com/2013/12/18/how-to-use-tabwidget-with-fragments/ – Prachi

Respuesta

13

Considere utilizar 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í están twoexamples mostrando esta técnica.

+1

Gracias. Pero si no trabajo con intenciones, ¿cómo puedo tener un menú diferente para cada pestaña? – paradroid666

+0

@paradroid: carga un menú diferente según la pestaña actualmente activa. – CommonsWare

+0

Ese es el punto en el uso de una actividad: es una mejor separación funcional. –

1

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

es, la LogCat sugiere me olvidó llamar 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)); 
+0

¿Funciona o no? –

+0

No funcionó para mí. –

+0

Parece que debería haber sido una pregunta separada. El problema con el que probablemente te encuentres es que no estás usando TabbedActivity, lo que significa que debes llamar a la configuración con el ActivityManager, como se sugirió anteriormente. Eso lo llevará a este problema, a menos que envíe los eventos al ActivityManager correctamente. – shortstuffsushi

86

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

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

Del mismo modo, es necesario agregar para onResume,

mlam.dispatchResume(); 

onPause(),

mlam.dispatchPause(isFinishing()); 
+1

Esto funciona! ¡Alguien debería aceptar esta solución! – shihpeng

+4

¿Pero podría explicar por qué funciona después de agregar estos métodos dispatchXXX()? Muchas gracias :) – shihpeng

+0

¡Genial funcionó para mí! –

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

} 
+1

'LocalActivityManager' está en desuso ahora –

Cuestiones relacionadas