Android: ¿Por qué se llama onTabSelected cuando se crean pestañas?

Cuando la barra de acción tiene pestañas, he notado que onTabSelected se llama cuando la actividad se carga en la pantalla. También se llama cada vez que ocurre un cambio de orientación. Mi código consulta la base de datos dependiendo de la ficha seleccionada y muestra los resultados de la consulta en el diseño cargado.

Mi problema es cuando se guarda el estado de la pestaña, y la pestaña seleccionada actual es 1 o superior, en estado de restauración, ya que onTabSelected se llama por defecto en la pestaña 0, se volverá a llamar cuando la pestaña de estado restaurada sea 1 o superior. Esto hace que la consulta de base de datos en la pestaña 0 sea inútil.

Cómo configurar android que onTabSelected no se llama en la creación de la pestaña o por lo menos detectar que esta llamada es por defecto y no disparado por el usuario?

@Override public void onTabSelected(Tab tab, FragmentTransaction ft) { int tabPos = tab.getPosition(); switch(tabPos) { case 0: // query database and display result break; case 1: // a different query and display result break; case 2: ... } } @Override public void onRestoreInstanceState(Bundle savedInstanceState) { if(savedInstanceState.containsKey(STATE_SELECTED_TAB)) { getActionBar().setSelectedNavigationItem(savedInstanceState.getInt(STATE_SELECTED_TAB)); } super.onRestoreInstanceState(savedInstanceState); } @Override public void onSaveInstanceState(Bundle outState) { outState.putInt(STATE_SELECTED_TAB, getActionBar().getSelectedNavigationIndex()); super.onSaveInstanceState(outState); } 

Complicación añadida: cuando la pestaña seleccionada actual es 0, y la orientación cambia, onTabSelected todavía se llama dos veces! Una vez que las pestañas se crean inicialmente y la segunda vez cuando onRestoreState restaura el estado seleccionado de la pestaña guardada, aunque sea 0.

Lo que originalmente se suponía era que onTabSelected fue llamado dos veces, pero estaba equivocado. Era mi fragmento onCreateView que se llamaba dos veces, algunos errores en la transacción del fragmento que agregaron el mismo fragmento dos veces en cambio de la orientación. OnTabSelected se llama una vez y restaura las llamadas de estado onTabReselected se llama también cuando la ficha restaurada también es 0.


Después de fregar SO y google, he encontrado esta cuestión para tener causa similar de problema. Creando la pestaña ActionBar también llamando a sus funciones selectTab

2 Solutions collect form web for “Android: ¿Por qué se llama onTabSelected cuando se crean pestañas?”

Así que después de revisar los documentos de referencia en ActionBar desde el sitio Android de Google, el método addTab es el responsable de llamar a onTabSelected de forma predeterminada.

 public abstract void addTab (ActionBar.Tab tab) 

Agregue una pestaña para usarla en el modo de navegación con pestañas. La pestaña se agregará al final de la lista. Si esta es la primera pestaña a ser agregada, se convertirá en la pestaña seleccionada.

Parámetros
Ficha Tab para añadir

Por cierto, existen otros métodos sobrecargados que no llaman onTabSelected.

 public abstract void addTab (ActionBar.Tab tab, boolean setSelected) 

Así que utilicé estos métodos alternativos en lugar de otro y fijó el problema. Sin embargo, una vez que las pestañas se muestran, la primera pestaña puede aparecer seleccionada aunque no sea. Al hacer clic en él se llamará onTabSelected y no onTabReselected.

Creo que puedes hacer esto (e ignorar cualquier error tipográfico por favor :-)):

 public class MainActivity extends FragmentActivity { boolean isConfigChanged; int savedTabIndex; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if(savedInstanceState != null){ if(savedInstanceState.containsKey(STATE_SELECTED_TAB)) { savedTabIndex = savedInstanceState.getInt(STATE_SELECTED_TAB); //getActionBar().setSelectedNavigationItem(savedTabIndex); actually you do not need this } isConfigChanged = true; } // here add actionbar tabs //...} 

y en :

Debajo del código comprueba que si la configuration cambia y la pestaña seleccionada por el usuario not zero es not zero por lo que es la llamada predeterminada e ignora pero si isConfigChanged == true y la pestaña seleccionada por el usuario es 0 must query DB o si isConfigChanged == false debe consultar DB porque Es la primera vez que la aplicación se está cargando. Un juego rápido puede ajustarse a lo que quieres.

  @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { if(isConfigChanged && savedTabIndex != 0){ isConfigChanged = false; return; } isConfigChanged = false; int tabPos = tab.getPosition(); switch(tabPos) { case 0: // query database and display result break; case 1: // a different query and display result break; case 2: ... } } 

Eliminar enRestore

 @Override public void onSaveInstanceState(Bundle outState) { outState.putInt(STATE_SELECTED_TAB, getActionBar().getSelectedNavigationIndex()); super.onSaveInstanceState(outState); } 
  • Android: Barra de Acción
  • Agregue los iconos al adaptador de las lengüetas que extiende FragmentPagerAdapter
  • Cómo actualizar el contenido de la ficha de fragmento en el botón de clic
  • Android: Listview se duplica cuando inicie una nueva actividad y presiona atrás para volver a ella
  • Hwo para corregir el error de método de reemplazo?
  • Cómo cambiar el estilo de pestaña en Android?
  • ¿Cómo inhabilito las pestañas deslizantes cuando estoy en la barra de acción contextual, haciendo que las pestañas no se puedan hacer clic / deslizar?
  • Contenido de la barra ActionBar que se superpone
  • ¿Cómo mantener el estado del fragmento sin backstack en la pestaña?
  • Las pestañas muestran el fragmento en blanco al volver a fragmentar la segunda vez
  • Android: dos actividades, una pestaña
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.