2011-08-02 9 views
5

Estoy intentando guardar una subclase ListFragment en un cambio de orientación, así que agregué setRetainInstance (true) al final de mi función onCreate. Agregué un método onSaveInstanceState para agregar todos sus datos a un paquete, luego agregué código en onActivityCreated para cargar esos datos nuevamente. Lamentablemente, no funcionaría.setRetainInstance no funciona para ListFragment cuando se utiliza la biblioteca compatibiltiy

Cuando agregué algunos mensajes de depuración con la ayuda de Log.d descubrí que no solo no se llamaba onSaveInstanceState, sino que onCreate was (que la documentación parece indicar que no debería suceder cuando retenInstance es verdadero). Ni onCreate ni onActivityCreated tienen paquetes con mis datos (insuperablemente).

Supongo que esto puede ser un problema con la biblioteca de compatibilidad, aunque no tengo un dispositivo Android 3.0+ para probar esto.

Se agradece cualquier ayuda y puedo publicar algunos fragmentos de código si es necesario, aunque no estoy haciendo nada complicado.

Actualización: OnDestroy no está siendo llamada cuando cambio de orientación (que es como debe ser), por lo que parece que algunos de setRetainInstance está trabajando

+1

Sugeriría depurar la librería de compatibilidad para ver qué está pasando. ¿Qué versión de la libreta de compatibilidad está usando? Estoy usando r1 y evité r2 porque hay al menos un error de regresión con el que no se llama a onDestroy cuando se reemplaza un fragmento. – PJL

+0

Estoy usando r3, buscaré una versión anterior para ver si eso ayuda. ¿Alguna sugerencia sobre cómo llevar a cabo la depuración de la compat lib? Soy muy nuevo para depurar Java. – rofer

+0

Intenta entrar en uno de los métodos de compatibilib y deberías pedirte la ubicación de las fuentes. – PJL

Respuesta

10

finalmente me di cuenta de lo que era mi problema. Todo se redujo a una sola línea que había olvidado agregar. En mi subclase FragmentActivity anularía onSaveInstanceState, pero nunca llamé a super.onSaveInstanceState. Aparentemente, a diferencia de otros métodos cuyos padres había olvidado llamar, onSaveInstanceState no arrojará un error de tiempo de ejecución cuando me olvidé de llamar a la versión de las clases principales, en cambio setRetainInstance simplemente deja de funcionar. Espero que esto le ahorre a alguien el dolor de cabeza que pasé tratando de resolver esto.

+1

Acabo de enfrentar el mismo problema. La cuestión es que no está obligado a llamar al método de la superclase, pero los fragmentos no se conservarán si no lo hace. Tuve que buscar en el código fuente de la biblioteca de compatibilidad para resolver esto. – Malcolm

+1

@rofer No tiene que implementar onSaveInstanceState para que setRetainInstance funcione, ¿verdad? –

1

Parece que cuando se establece setRetainInstance = true mientras se llaman onSaveInstanceState() y onActivityCreated(), entonces Bundle no se devolverán.

Sin embargo, como se conserva el ListFragment, puede simplemente almacenar su estado en un campo y manejarlo dentro de onActivityCreated().

Tenga en cuenta que el Activity seguirá destruyéndose y recreándose.

Cuestiones relacionadas