Android – Tabhost trabajando en la clase de actividad

OK, debo estar mirando algo tonto porque no puedo conseguir que mi tabhost se muestre en mi clase de actividad. Estoy consiguiendo la fuerza temida cerca cuando intento funcionar la aplicación. Funcionará si yo extiendo TabActivity, pero no puedo hacer eso [ver editar abajo] porque una vez que mueva el código de mi proyecto prototipo va a estar en una clase personalizada que hereda de Activity.

Aquí está el diseño 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í está la clase que está tratando de crear y mostrar el 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 obtengo en el registro.

 11-17 16:49:51.271: INFO/com.my_proto.my_proto@43b80b50(1302): OnCreate 11-17 16:49:51.472: INFO/com.my_proto.my_proto@43b80b50(1302): get tab host 11-17 16:49:51.480: INFO/com.my_proto.my_proto@43b80b50(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 lo estoy llamando. Hay otra versión de la instalación que necesita algún tipo de LocalActivityMananger. He intentado substituir la llamada para fijar la llamada abajo pero ninguna suerte.

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

[Editar] La llamada anterior no funcionó, así que la retiré. Aunque estaba recibiendo 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] Basándome en algunos de los comentarios a continuación, me di cuenta de que necesito ser más claro acerca de por qué no puedo heredar de TabActivity. Una vez que tenga el prototipo trabajando necesito portar esto en la pantalla de una aplicación existente que hereda de Activity. Necesitaré cargar el TabHost en un Layout dentro de esa Actividad. Básicamente será un LinearLayout con una fila de iconos de estado, seguido de mi LinearLayout con el Tabhost en él. Sé que si puedo conseguir este trabajo puedo pasar a la siguiente fase. ¡Gracias!

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

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

Así que hay dos opciones:

1) Si desea que el contenido de la pestaña sea actividades, haga que su clase extienda ActivityGroup (en lugar de Activity ). Entonces su llamada a la instalación debe ser host.setup(getLocalActivityManager());

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

2) Si puede tener el contenido de su ficha como vistas (vs actividades), mantenga su clase como extendiéndose desde Activity y mantenga su llamada a setup() . Pero para la parte de 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 la vista de lista dentro de createTabContent (que es lo que hago normalmente – prefiero usar vistas en lugar de actividades como el contenido de las pestañas).

Si tiene un escenario en el que necesita utilizar la clase de actividad para su Tabhost puede probar lo siguiente funciona.

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

Tenía el mismo problema: esta pregunta ayuda a Android: TabHost sin TabActivity

Aparentemente, sólo es necesario agregar una línea:

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

android:id="@+id/tabhost" no funciona para mí. Tengo que escribir android:id="@android:id/tabhost"

Cambié la clase a

 public class my_proto extends ActivityGroup 

Y cambie lo siguiente:

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

Parece bien para mi

Cambie la declaración de clase que tiene esto:

 public class my_proto extends Activity 

a

 public class my_proto extends TabActivity 

Lo que dice tommie es cierto. También debe ver el tutorial aquí http://developer.android.com/resources/tutorials/views/hello-tabwidget.html

  • Nullpointer excepción en oncreateView () de fragmento
  • Cómo hacer que un método View invisible / Gone onBackPressed () en android
  • Android FragmentTabHost
  • Separadores de tabulación que no se muestran en ICS
  • Android OnResume no se llama cuando se usa TabHost y LocalActivityManager
  • Pestañas personalizadas en android
  • Android FragmentTab host y Fragmentos dentro de Fragmentos
  • Android TabWidget detectar clic en la pestaña actual
  • Android - TabActivity con animación de Transición
  • Tab Layout tutorial incompleto?
  • Insignia de número de dibujo como iPhone en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.