36

Cambié parte de mi aplicación de Actividades a Fragmentos para que pueda usar las pestañas de ActionBar ordenadas.OnCreateView llamado varias veces/Trabajando con ActionBar y Fragmentos

Sin embargo, después de completar la transición me encontré con un problema: cada vez que cambio a otra pestaña, ese Fragmento se vuelve a crear. Tanto onCreate como onCreateView se llaman cada vez que llego a una pestaña.

tengo 4 tabletas, cada uno de los cuales se supone debe abrir uno de estos fragmentos:

Fragment ShopFragment = new WebActivity(); 
Fragment SearchFragment = new SearchActivity(context); 
Fragment StoreFragment = new StoreLocatorActivity(context, this); 
Fragment BlogsFragment = new BlogsActivity(context, this); 

Aquí está mi código para el oyente:

class MyTabsListener implements ActionBar.TabListener { 
     public Fragment fragment; 

     public MyTabsListener(Fragment fragment) { 
      this.fragment = fragment; 
     } 

     @Override 
     public void onTabReselected(Tab tab, FragmentTransaction ft) { 
      ft.hide(fragment); 
     } 

     @Override 
     public void onTabSelected(Tab tab, FragmentTransaction ft) { 
      ft.replace(R.id.fragment_container, fragment); 
     } 

     @Override 
     public void onTabUnselected(Tab tab, FragmentTransaction ft) {   

     } 

    } 

Podría alguien por favor me punto en la derecha ¿dirección?

+0

¿Alguien sabe cómo podría manejar esto por favor? –

Respuesta

43

Cuando llame al FragmentTransaction.replace(...), Android realizará efectivamente una secuencia de FragmentTransaction.remove(...) (para todos los Fragmentos actualmente agregados a ese contenedor) y FragmentTransaction.add(...) (para el Fragmento suministrado). Al eliminar un fragmento del FragmentManager, se destruirá el fragmento y su estado dejará de estar gestionado. Lo más notable es que cuando vuelvas a agregar el Fragmento, todas las vistas se habrán restablecido. Nota: ya que está reutilizando la misma instancia de Fragment, el Fragment aún mantendrá el valor de cualquier variable de instancia.

Una solución a este problema sería utilizar FragmentTransaction.detach(Fragment) y FragmentTransaction.attach(Fragment) al cambiar. Esto hará que se vuelvan a crear las vistas de Fragmento (onDestroyView() & onCreateView() se llamará), pero el paquete de estado de la instancia se guardará y se le devolverá entre llamadas para que se pueda mantener el estado de la vista. Este es el enfoque adoptado por FragmentPagerAdapter cuando intenta cambiar entre Fragmentos.

De forma alternativa, podría permitir destruir los fragmentos, pero mantener su estado guardado para ellos de forma independiente. Esto usaría menos memoria, a expensas de un tiempo de conmutación más lento. Los métodos de observación serían FragmentManager.saveFragmentInstanceState(Fragment) y FragmentManager.setInitialSavedState(Fragment.SavedState), junto con la adición/eliminación. Este es el enfoque adoptado por FragmentStatePagerAdapter.

Puede echar un vistazo a source for FragmentPagerAdapter y source for FragmentStatePagerAdapter para obtener sugerencias de implementación.

+0

Esto es una solución. onCreate y onCreateView todavía reciben llamadas y los estados de ahorro requieren mucho trabajo. ¿No hay una manera de mantener la vista ya pintada del fragmento de wach y simplemente reemplazarlos? ¿Por qué pintarlos de nuevo? –

+1

Existe la opción ocultar. –

+0

Hola, estoy usando pestañas de ActionBar y usando ¡adjuntar y separar! ¿Puedes explicar con un código de ejemplo cómo puedo guardar el estado de la instancia cuando cambio a otra pestaña y luego mantengo el estado cuando vuelvo a la pestaña? Gracias –

7

existe la opción show/hide no necesitarían ser repintado/recreado por lo que sólo los fragmentos y el onCreate() y onCreateView() no se reinvoked.

+2

Encontré la solución aquí: http://stackoverflow.com/a/11003859/435605 –

Cuestiones relacionadas