Fragmento Android ve pérdida de estado al utilizar FragmentTransaction.replace ()
Estoy teniendo un problema bastante grande y no estoy muy entendiendo lo que está sucediendo. Estoy desarrollando una aplicación que utiliza Fragmentos (de la biblioteca de soporte) y estoy utilizando FragmentTransaction.replace()
para colocar nuevos Fragmentos en la pila posterior y reemplazar el antiguo. El código se ve así:
FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = ft.beginTransaction(); // Animations in my res/anim folder ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right); ft.replace(R.id.fragment_container, newFragment, tag); ft.addToBackStack(null); ft.commit();
Esto es un éxito en la sustitución de mi fragmento. Mi problema es el siguiente. En un fragmento, tengo una lista de elementos que se construye a partir de la entrada del usuario. Ahora, cuando el usuario hace clic en Siguiente y luego hace clic en el botón Atrás (para volver a la lista), la lista está vacía porque la vista se destruye. Ahora, he observado lo siguiente:
- ¿Cuándo puedo primero medir una vista?
- Omitir correctamente la actividad de inicio de sesión si ya ha iniciado sesión
- Al cerrar la sesión, desactive la pila del historial de actividades, evitando que el botón "volver" abra las actividades activadas
- Android Fragment onCreateView vs. onActivityCreated
- Reiniciar una actividad ya en ejecución
- OnSaveInstanceState no se llama. Creo que esto es porque eso sólo se llama cuando la Actividad de los padres le dice a. Basado en los documentos: "Hay muchas situaciones en las que un fragmento puede ser mayormente roto (como cuando se coloca en la pila trasera sin mostrar la interfaz de usuario), pero su estado no se guardará hasta que su actividad de propiedad realmente necesita para guardar su estado . ". Al parecer, realizar una sustitución en la FragmentTransaction no es uno de esos tiempos. ¿Alguien tiene confirmación sobre esto o una mejor explicación?
- SetOnRetainInstanceState (true) no es útil en esta situación. Una vez más, creo que esto tiene que ver con la información de los documentos: "Controlar si una instancia de fragmento se retiene a través de la recreación de actividad (como por ejemplo desde un cambio de configuración)". No estoy realizando ninguna acción en volver a crear la actividad así que esto no sirve de nada.
Por lo tanto, supongo que mi pregunta principal es: ¿hay una manera de preservar el estado de vista (simplemente mantener el fragmento) cuando se utiliza replace
? Hay FragmentTransaction.add()
, pero hay algunos problemas con esto también. Una de ellas es que la animación de salida no se realiza, por lo que la animación no es correcta. Otra es que el nuevo fragmento que el antiguo fragmento (el que se está poniendo en un estado no visible) sigue siendo clicable. Por ejemplo, si tengo un ListFragment, y coloco un fragmento de contenido encima de eso usando add, todavía puedo hacer clic en los elementos de lista en el ListFragment.
- ¿Por qué utilizar Fragment # setRetainInstance (boolean)?
- Cuándo usar y cuándo no utilizar un servicio en Android
- ¿Puedo obtener la prueba de instrumentación para matar y reiniciar el proceso de la aplicación?
- cómo comprobar si una actividad implementa una interfaz después de onAttach (Activity activity) ha sido depreciada
- Transición de la actividad: Realización de la parada de la actividad que no se reanuda
- Principiante de Android: onDestroy
- ¿Este patrón de mensajería de Servicio de Actividad causa una pérdida de memoria?
- Realización de una parada de actividad que no se reanuda - Android
Sin poder ver el código de tus fragmentos esto es un poco una suposición, pero en el pasado he corrido en este mismo problema y he encontrado que reajustar el adaptador en tu ListFragment
en onViewStateRestored
parece hacer el truco.
public void onViewStateRestored (Bundle savedInstanceState) { super.onViewStateRestored (savedInstanceState); setListAdapter(new ArrayAdapter(Activity, R.layout.nav_item, objects)); }
Lo que es extraño teniendo en cuenta que la documentación indica que este método se llama después onActivityCreated
pero antes onStart
. Pero parece que también se llama en otras ocasiones porque cuando se envía la transacción de fragmento más reciente de la pila trasera se llama a este método antes de que se muestre el fragmento previamente reemplazado. La actividad que posee los fragmentos no ha sido pausada u oscurecida de ninguna manera, por lo que de acuerdo con los documentos onViewStateRestored
no se debe llamar ya que solo los fragmentos fueron modificados. Pero esto parece funcionar de todos modos.
Suena como si sólo necesita asegurarse de que ha implementado correctamente onCreateView y onDestroyView. La situación que está describiendo parece indicar que cuando se coloca el fragmento de lista en la pila trasera (como resultado de la transacción de reemplazo) Android está llamando a onDestroyView para liberar algunos recursos. Sin embargo, al parecer no ha destruido el fragmento de la lista, porque al pulsar de nuevo se está recuperando la misma instancia del fragmento.
Suponiendo que esto es cierto, entonces, cuando el usuario vuelve a llamar a Android llamará a CreateView. Cualquier estado que haya almacenado en las variables de instancia del fragmento debe estar allí y todo lo que necesita hacer es repoblar la vista … tal vez configurar el adaptador en el ListView o lo que sea.
También asegúrese de que su devolución de llamada onSaveInstanceState () realmente guarda cualquier estado de instancia que necesita para reconstruir la vista. De esta manera, si el fragmento realmente se destruye completamente, el FragmentManager puede restaurar el estado cuando necesita recrear el fragmento más tarde.
- Múltiples padres en estilos de Android xml
- Com.google.android.gms.auth.GoogleAuthException: Desconocido