tutorial studio setsupportactionbar onfragmentinteractionlistener fragments example dinamicos android memory-management garbage-collection fragment recreate

android - studio - onfragmentinteractionlistener



Evitar la recuperaciĆ³n de fragmentos en Android (6)

Aquellos que obtuvieron NPE con ViewPager cuando usan este método descrito en la respuesta aceptada, anule

ViewPager.onRestoreInstanceState(Parcelable state)

método y llamada

super.onRestoreInstanceState(null);

en lugar.

Estamos utilizando Fragmentos y no necesitamos que se recuperen automáticamente cuando se recrea la Actividad. Pero Android cada vez que se Activity::onCreate(Bundle savedInstanceState) -> super.onCreate(savedInstanceState) , restaura Fragmentos incluso si usamos setRetainInstance (false) para esos Fragmentos.

Además, en esos Fragments se llama directamente Fragment.performCreateView() sin pasar por Fragment::onAttach() y así sucesivamente. Además, algunos de los campos son nulos dentro del Fragment restaurado ...

¿Alguien sabe cómo evitar que Android restaure fragmentos?

PD Sabemos que en caso de recrear la Actividad para los cambios de configuración se podría hacer agregando a manifestar a ndroid:configChanges="orientation|screenSize|screenLayout . ¿Pero qué hay de la actividad de recreación en caso de limpieza automática de memoria?


Eliminé los fragmentos en Activity onCreate.


La jerarquía de vista no se restaura automáticamente. Por lo tanto, en Fragment.onCreateView() o Activity.onCreate() , debe restaurar todas las vistas (desde xml o programáticamente). Cada grupo de visualización que contiene un fragmento debe tener el mismo ID que cuando lo creó la primera vez. Una vez que se crea la jerarquía de vista, Android restaura todos los fragmentos y pone sus vistas en el Grupo de visualización correcto gracias a la ID. Digamos que Android recuerda la identificación del ViewGroup en el que estaba un fragmento. Esto sucede en algún lugar entre onCreateView() y onStart() .


La respuesta de @goRGon fue muy útil para mí, pero dicho uso causa serios problemas cuando hay más información que necesita reenviar a su actividad después de la recreación.

Aquí hay una versión mejorada que solo elimina "fragmentos", pero conserva todos los demás parámetros.

La ID que se elimina del paquete forma parte de la clase android.support.v4.app.FragmentActivity como campo FRAGMENTS_TAG . Por supuesto, puede cambiar con el tiempo, pero no se espera.

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(createBundleNoFragmentRestore(savedInstanceState)); } /** * Improve bundle to prevent restoring of fragments. * @param bundle bundle container * @return improved bundle with removed "fragments parcelable" */ private static Bundle createBundleNoFragmentRestore(Bundle bundle) { if (bundle != null) { bundle.remove("android:support:fragments"); } return bundle; }


También tenía un ViewPager así que revisé el fragmentMananger si tenía fragmentos y los quité en onCreate() .

Usando por ejemplo este hilo: elimine todos los fragmentos del contenedor .

FragmentManager fm = getSupportFragmentManager(); for (Fragment fragment: fm.getFragments()) { fm.beginTransaction().remove(fragment).commitNow(); }

commitNow() para eliminar fragmentos de forma sincronizada.


Terminamos agregando actividad:

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(null); }

Suprime cualquier dato guardado en el ciclo de creación / recreación de una actividad y evita la recreación automática de fragmentos.