2011-11-24 13 views
7

Este es el escenario que causa problemas:¿Fragmento de error de backstack al reemplazar fragmentos en una transacción?

  1. que iniciar una Acitivity con un ViewGroup que va a sostener los fragmentos presentados.
  2. Cargo el Fragmento A en este Grupo de Vista al llamar a .replace() en la transacción que guardo en la copia de respaldo.
  3. Cargué el Fragmento B en el Grupo de Vista, reemplazando el Fragmento A. De nuevo, guardo la transacción.
  4. Giro el dispositivo dos veces.
  5. En la segunda rotación, el Fragmento A (que no está visible en este momento) emitirá una excepción NullPointer.

El Fragmento A arroja esta excepción, porque estoy guardando algunos valores de Vistas (EditTexts, por ejemplo) en su método onSaveInstanceState(). Parece que en la segunda rotación, el sistema no instancia estas Vistas, así que cuando les pregunto sus valores, obtengo una excepción de NullPointer. ¿Se puede evitar esto de alguna manera? ¿O está utilizando las operaciones de reemplazo en fragmentos de transcation guardados en la backstack sin previo aviso?

Respuesta

3

que he tenido esto, pero no puedo recordar los detalles de lo que hice para fijar pero en términos generales (y disculpas por la descarga del cerebro) hago lo siguiente:

  1. llamada setRetainInstance(true) en onCreate para evitar fragmento de recreación

  2. guardar el estado de los controles de edición, etc., en onSaveInstanceState para ser utilizado si la actividad se mata y se obtiene restaurado con un bulto no nulo (no debe someterse a un paquete no nulo en una orientación cambiar con 1.)

  3. mantener los valores de control de edición en variables miembro (como el fragmento no va a ser recreada) asegurar que se actualizan en un onDestroyView de los controles de edición y luego usarlos para restaurar los valores de control en onCreateView

  4. Tener una bandera que establecí en verdadero en onCreateView y falsa en onDestroyView y me aseguro de no tocar los controles de la interfaz de usuario cuando la vista no se encuentra.

Por cierto Usando replace al tiempo que añade la transacción a la pila de la espalda es perfectamente bien.

Espero que haya algo allí que ayude. Peter.

+3

He notado que aceptó esta respuesta ... ¿qué terminó siendo útil? –

Cuestiones relacionadas