2010-11-17 11 views
11

OK, debo pasar por alto algo tonto porque no puedo mostrar mi tabhost en mi clase de actividad. Estoy tratando de cerrar la temida fuerza cuando intento ejecutar la aplicación. Funcionará si extiendo TabActivity, , pero no puedo hacer eso [ver la edición a continuación] porque una vez que muevo el código de mi proyecto de prototipo va a estar en una clase personalizada que hereda de Activity.Android - Tabhost trabajando en la clase de actividad

Este es el diagrama XML:

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

Y aquí es la clase que está tratando de crear y mostrar la TabHost:

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.TabHost; 

public class my_proto extends Activity 
{ 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     Log.i(this.toString(), "OnCreate"); 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     Log.i(this.toString(), "get tab host"); 
     TabHost host = (TabHost)findViewById(R.id.tabhost); 
     host.setup(); 

     Log.i(this.toString(), "add tabs"); 
     host.addTab(host.newTabSpec("one") 
         .setIndicator("First Results") 
         .setContent(new Intent(this, FirstResultsListViewActivity.class))); 

     host.addTab(host.newTabSpec("two") 
         .setIndicator("Second Results") 
         .setContent(new Intent(this, SecondResultsListViewActivity.class))); 

     Log.i(this.toString(), "adjust tab size"); 
     host.getTabWidget().getChildAt(0).getLayoutParams().height = 35; 
     host.getTabWidget().getChildAt(1).getLayoutParams().height = 35; 

    }// end onCreate 

}// end class my_proto 

Este es el error que consigo en el registro.

11-17 16:49:51.271: INFO/[email protected](1302): OnCreate 
11-17 16:49:51.472: INFO/[email protected](1302): get tab host 
11-17 16:49:51.480: INFO/[email protected](1302): add tabs 
11-17 16:49:51.521: DEBUG/AndroidRuntime(1302): Shutting down VM 
11-17 16:49:51.521: WARN/dalvikvm(1302): threadid=3: thread exiting with uncaught exception (group=0x4001b188) 
11-17 16:49:51.530: ERROR/AndroidRuntime(1302): Uncaught handler: thread main exiting due to uncaught exception 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my_proto/com.my_proto.my_proto}: java.lang.IllegalStateException: Did you forget to call 'public void setup(LocalActivityManager activityGroup)'? 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at android.app.ActivityThread.access$2200(ActivityThread.java:119) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at android.os.Handler.dispatchMessage(Handler.java:99) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at android.os.Looper.loop(Looper.java:123) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at java.lang.reflect.Method.invoke(Method.java:521) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at dalvik.system.NativeStart.main(Native Method) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302): Caused by: java.lang.IllegalStateException: Did you forget to call 'public void setup(LocalActivityManager activityGroup)'? 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:646) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at android.widget.TabHost.setCurrentTab(TabHost.java:320) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at android.widget.TabHost.addTab(TabHost.java:213) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at com.mc_proto.mc_proto.onCreate(my_proto.java:29) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  ... 11 more 

Se queja de no llamar a la configuración, pero la estoy llamando. Hay otra versión de configuración que necesita algún tipo de LocalActivityMananger. He intentado reemplazar la llamada para configurar la llamada a continuación, pero no tuve suerte.

LocalActivityManager mLocalActivityManager = new LocalActivityManager(this, false); 
host.setup(mLocalActivityManager); 

[editar] La llamada anterior no funcionó, así que la retiré. Aunque recibía un nuevo error registrado.

11-17 20:24:58.382: ERROR/AndroidRuntime(1432): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my_proto/com.my_proto.my_proto}: java.lang.IllegalStateException: Activities can't be added until the containing group has been created. 

[editar] Sobre la base de algunos de los comentarios de abajo me di cuenta de que tengo que ser más clara acerca de por qué no puedo heredar de TabActivity. Una vez que tengo el prototipo en funcionamiento, necesito conectarlo a la pantalla de una aplicación existente que hereda de Activity. Tendré que cargar el TabHost en un diseño dentro de esa actividad. Básicamente será un LinearLayout con una fila de íconos de estado, seguido de un LinearLayout con el Tabhost en él. Sé que si logro que esto funcione, puedo pasar a la siguiente fase. ¡Gracias!

--------------------------- 
|  status icons  | 
--------------------------- 
| Tab, Tab, Tab  | 
|       | 
|       | 
|       | 
--------------------------- 
|  status icons  | 
--------------------------- 

Respuesta

30

Ok, lo descubrí. Aparentemente, TabActivity se extiende ActivityGroup, que se extiende Activity. Pero en su código, su clase extiende Activity que no es un grupo de actividades.

Así que hay dos opciones:

1) Si desea que el contenido de la ficha sea actividades, haga que su clase se extienden ActivityGroup (en lugar de Activity). Luego, su llamada a la configuración debe ser host.setup(getLocalActivityManager());

De esta manera está emulando el código fuente TabActivity.

2) Si puede hacer que su contenido de pestañas sea vistas (frente a actividades), mantenga su clase extendiéndose desde Activity, y mantenga su llamada al setup().Sin embargo, para la parte setContent hacer algo como esto:

host.addTab(host.newTabSpec("two") 
       .setIndicator("Second Results") 
       .setContent(new TabContentFactory() { 

        public View createTabContent(String tag) { 
         return new TextView(TestActivity.this); 
        } 
       })); 

Y luego definir su vista de lista en el interior createTabContent (que es por lo general lo que hago - Yo prefiero el uso de vistas en lugar de actividades como el contenido de las pestañas).

+0

gracias por todo tu tiempo. Todavía no estoy del todo allí, si miras la foto de arriba, voy a tener que encajar el host de pestañas en un panel central de una pantalla cuya clase base es Actividad. Me sorprende que con LocalActivityManager mLocalActivityManager = new LocalActivityManager (esto, falso); host.setup (mLocalActivityManager); no funciona cuando se usa una actividad. Vi tu tutorial sobre el uso de ListViews en las pestañas y voy a analizarlo. Actualmente, cada una de mis pestañas es un ListView, aunque ese no siempre será el caso. ¡Gracias! – bursk

+1

gracias a que funciona –

0

Cambiar la declaración de la clase que tiene esto:

public class my_proto extends Activity 

a

public class my_proto extends TabActivity 
+0

no puedo hacer eso. Dije en mi descripción "va a necesitar heredar de una clase personalizada que hereda de Activity" – bursk

+0

@cbursk: que no estaba allí cuando contesté aquí ... que fue editado después de publicar la respuesta ... – t0mm13b

+0

Fue ahí. Agregué los detalles después de tu publicación. No es gran cosa. – bursk

2

android:id="@+id/tabhost" doesnt work for me. Tengo que escribir android:id="@android:id/tabhost"

1

he cambiado la clase de

public class my_proto extends ActivityGroup 

y cambiar lo siguiente:

this.mHost = (TabHost) findViewById(R.id.tabhost); 
this.mHost.setup(getLocalActivityManager()); 

Parece bien para mí

+0

ActivityGroup está en desuso –

10

Si usted tiene un escenario en el que se Necesito usar la clase Activity para tu Tabhost, puedes probar lo siguiente.

tabHost = (TabHost) findViewById(R.id.tabhost); //here tabHost will be your Tabhost 
    LocalActivityManager mLocalActivityManager = new LocalActivityManager(mActivity, false); 
    mLocalActivityManager.dispatchCreate(state); // state will be bundle your activity state which you get in onCreate 
    tabHost.setup(mLocalActivityManager); 
+0

Esto funciona y aún mantiene su actividad como una actividad normal. – Warpzit

+0

Esto funcionó para mí. Aunque LocalActivityManager está en desuso, esta puede ser una solución plausible hasta que cambie a usar la API de Fragmentos. – fosstrack

+0

me salvó la vida gracias. – Anirban

8

tenía el mismo problema: esta pregunta ayuda Android: TabHost without TabActivity

Al parecer, sólo tiene que añadir una línea:

LocalActivityManager mLocalActivityManager = new LocalActivityManager(this, false); 
mLocalActivityManager.dispatchCreate(savedInstanceState); 
host.setup(mLocalActivityManager); 
Cuestiones relacionadas