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:
- FragmentTabHost & Fragments - ¿Cómo puedo pasar datos entre pestañas?
- Android - FragmentTabHost me da "No se conoce ninguna pestaña para la etiqueta null"
- Android TabHost.addTab -> Excepción de puntero nulo
- El color de TabHost cambió entre las versiones de Android
- StateListDrawable para cambiar filtros de color
<?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 | ---------------------------
- Android - Navegación por pestañas <al extender una nueva actividad>
- Cómo cambiar el tamaño de fuente de tabhost en android
- InputMethodManager contiene referencia al tabhost - Memory Leak - OOM Error
- Inflar un diseño con ImageButton en Fragmento mediante programación
- Fragmentos lentos Android TabHost lento
- EditText y TabHost no se gustan entre sí
- Eliminar una pestaña y la actividad (intención) dentro de ella desde un TabHost
- ViewPager dentro de Fragmento pierde contenido al volver a él
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
- Android: implementación de la compatibilidad con el paquete de iconos
- Android: detección de gestos de lanzamiento