Quiero crear pestañas sin la ampliación de TabActivity. (La razón es que TabActivity no puede manejar personalizados en la barra de título como parece). He

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 me sale 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 de 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!

InformationsquelleAutor paradroid666 | 2010-07-02

4 Comentarios

  1. 86

    Antes de llamar a tabHost.el programa de instalación(mLocalActivityManager); se debe agregar esta línea.

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

    del mismo modo, usted necesita agregar para onResume,

    mlam.dispatchResume(); 

    onPause(),

     mlam.dispatchPause(isFinishing());
    • Esto funciona! Alguien debe aceptar esta solución!
    • Pero podrías por favor explicar por qué esto funciona después de la adición de estos dispatchXXX() métodos? Muchas gracias:)
    • Gran funcionó para mí!
    • genial!! pero cualquier idea de por qué todas estas líneas adicionales?
    • no funciona para mí.. estoy recibiendo android.util.AndroidRuntimeException: You cannot combine custom titles with other title features. Tenga en cuenta que mi código es bastante similar, como se muestra en cuestión y voy a utilizar Título Personalizado característica.
    • Es un feo solución. Otra alternativa que se extiende ActivityGroup, pero la idea no es hacer la Actividad de extender cosas extrañas, sólo porque tiene para mostrar las pestañas. Así que tal vez CommonsWare la respuesta sobre el uso de puntos de vista es el mejor? Pero es un poco molesto no poder usar las actividades existentes…
    • También no funciona (o si la solución está incompleta, al menos). Todas mis fichas están ahora vacías.
    • Puede alguien aceptar esta respuesta ? que las rocas …
    • es necesario el uso de dispatchStop() dentro de onStop() y dispatchDestroy() dentro de onDestroy ?
    • de acuerdo a alvinalexander.com/java/jwarehouse/android/core/java/android/… es necesario, pero he visto un montón de null pointer exception debido a dispatchDestroy()
    • tnx! a mí me funciona. He perdido más tiempo con Google Maps
    • Me ahorró mucho tiempo Gracias

  2. 13

    Por favor, considere el uso de Views como el contenido de sus pestañas. No sólo este resultado en menos código, consumido menos montón de espacio, consume menos espacio en la pila, y la menor utilización de la CPU, que te llevará más allá de este problema. Aquí están dos ejemplos mostrando esta técnica.

    • Gracias. Pero si yo no trabajo con calidades de ¿cómo puedo tener un menú diferente para cada ficha?
    • carga un menú diferente basado en la pestaña activa.
    • Ese es el punto en el uso de una actividad – que es una mejor separación funcional.
    • De verdad que no. Actividades-en-tabs ha quedado obsoleta, ya que Google está de acuerdo en que era una mala idea.
  3. 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());
        }
    
    }
    • LocalActivityManager es obsoleto ahora
  4. 1

    Consideraciones de diseño no obstante, 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, la ampliación de Activity y la adición de setup() resultados de llamada en un exception at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:649)

    Gracioso es que el LogCat sugiere que se me 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));
    • ¿Funciona o no?
    • No funciona para mí.
    • Esto parece que debería haber sido una pregunta aparte. El problema es probable que ejecuta en es que usted no está utilizando un TabbedActivity, que significa que usted necesita para el inicio de la llamada con el ActivityManager, como se sugirió anteriormente. Que luego te llevará a este problema, a menos que te envío los eventos a los ActivityManager correctamente.

Dejar respuesta

Please enter your comment!
Please enter your name here