Android: cambie de pestaña dentro de una actividad dentro de una pestaña

Actualmente tengo un TabHost implementado con 3 tabs cada una que contiene una actividad separada. Mi pregunta es cómo puedo alternar entre tabs dentro de una de las actividades que se encuentran dentro del host de tabs. He buscado en todas partes y no he tenido éxito en encontrar una respuesta real a este problema.

Después de un largo tiempo de luchar contra este problema, he podido encontrar una solución para cambiar las tabs cuando uso tabs basadas en actividad.

En la clase de actividad para padres donde se creó el tabhost implementé un método como el siguiente:

public void switchTab(int tab){ tabHost.setCurrentTab(tab); } 

Dentro de la pestaña que me gustaría poder cambiar internamente a otra pestaña, creé el siguiente método:

 public void switchTabInActivity(int indexTabToSwitchTo){ MintTrack parentActivity; parentActivity = (MintTrack) this.getParent(); parentActivity.switchTab(indexTabToSwitchTo); } 

Si desea un buen ejemplo de este código, puede echar un vistazo a mi proyecto MintTrack aquí y aquí .

Como nota al margen, tenga mucho cuidado al decidir si usar TabHost basado en vista o actividad.

Activity tabs basadas en Activity son geniales porque pueden separarse en su propio archivo XML. Las actividades también pueden organizarse en su propio archivo Java en lugar de estar desordenado en uno. Dicho esto, algunas de las cosas que usted pensaría serían fáciles de complicar con tabs basadas en actividades. Es difícil pasar información entre tabs sin crear sobrecarga. Activity tabs basadas en Activity también usan más tiempo de memoria / CPU ya que tienen la sobrecarga de la Activity alrededor de cada una de ellas. Considere esto y los muchos intercambios antes de sumergirse en el uso de un TabHost basado en TabHost . Ahora sé que personalmente iría con un TabHost basado en TabHost si alguna vez los utilizo de nuevo.

Me encontré con el mismo problema. Si bien una sola actividad para todas las tabs sería mejor, a veces tomar la salida más fácil es la elección racional.

Para evitar crear una nueva actividad de tabs cuando una pestaña desea cambiar a otra pestaña, puse esto en mi AndroidManifest.xml:

  

Envíe un bash con la pestaña que desea:

 class OneTabContentActivity { void switchTab() { final Intent intent = new Intent(mContext, MyTabsActivity.class); intent.setAction("Switch to tab 1, please"); mContext.startActivity(intent); } class MyTabsActivity { @Override protected void onNewIntent (Intent intent) { super.onNewIntent(intent); getTabHost().setCurrentTab(1); } } 

Esta solución tiene inconvenientes, pero no tengo claro los detalles. Alguien más podría saber lo suficiente como para señalarlos.

Primero, establezco un método para mi clase principal, que amplía TabActivity, llamémoslo “MainActivity”

 public TabHost getMyTabHost() { return tabHost; } 

Luego, agrego mi clase de actividad de tabs;

 MainActivity ta = (MainActivity) this.getParent(); TabHost th = ta.getMyTabHost(); th.setCurrentTab(0); 

Funcionó para mí

Paso # 1: Reemplaza las tabs-holding-activities con tabs- setContent() -views usando una mejor forma de setContent() en TabSpec

Paso # 2: llama a setCurrentTab() en tu TabHost desde tu única Activity

Aún no he visto ningún beneficio de tener una Activity como el contenido de una pestaña en lugar de una simple View . Tener una Activity como contenido de la pestaña desperdicia tiempo y memoria de la CPU (y, por lo tanto, la duración de la batería) y hace las cosas como si estuvieras tratando de hacerlo mucho más difícil.

Tuve un problema ligeramente diferente y pensé que agregaría esto a cualquier persona que se enfrente a una situación similar. Tengo una aplicación con tabs basada en actividades y una de las actividades de tabs inicia otra actividad que no está controlada por el tabHost. Necesitaba tener un botón en esta actividad finish () (es decir, regresar a la vista principal de la pestaña) y cambiar a una pestaña diferente al mismo tiempo.

Decidí manejarlo con un BroadcastReceiver. En la clase que configura el TabHost, agregué esta clase:

 class ChangeTabReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "ChangeTabReceiver: received"); TabHost tabHost = getTabHost(); tabHost.setCurrentTab(1); } } 

..then definió los vars:

 ChangeTabReceiver changeTabReceiver; IntentFilter changeTabFilter; 

..then agregado a onCreate ():

 changeTabReceiver = new ChangeTabReceiver(); changeTabFilter = new IntentFilter(myApplication.CHANGE_TAB); registerReceiver(changeTabReceiver, changeTabFilter); 

Finalmente, en la actividad nueva cuando desee cerrar esa actividad y cambiar las tabs, haga esto:

 Intent intent = new Intent(myApplication.CHANGE_TAB); this.sendBroadcast(intent); this.finish(); 

Por supuesto, podría hacer un método para cambiar a varias tabs pasando el índice de tabs, pero en mi caso, este comportamiento solo ocurre en una actividad, así que decidí mantenerlo simple …

 public void switchTab(int index){ MintTrack ParentActivity; ParentActivity = (MintTrack) this.getParent(); ParentActivity.getTabHost().setCurrentTab(index); } 

Acabo de poner un public static TabHost tabHost; en mi TabActivity .

Luego, desde cualquier otra pestaña, puedo hacer una MyTabActivity.tabHost.setCurrentTab(tabNumber);

Funciona bien para mí (pero me gustaría haber usado Fragmentos desde el principio. Solo estaba siguiendo el tutorial Tab en la documentación de Android y trabajando desde allí)