2011-12-14 18 views
56

Estoy intentando guardar datos en onSaveInstanceState() de un fragmento, pero nunca se llama al método.Fragment's onSaveInstanceState() nunca se llama

¿Alguien puede ayudar?

public class MyFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     ScrollView content = (ScrollView) inflater.inflate(R.layout.content, container, false); 
     // More stuff 
     return content; 
    } 

    @Override 
    public void onSaveInstanceState(Bundle icicle) { 
     // NEVER CALLED 
     super.onSaveInstanceState(icicle); 
     //More stuff 
    } 

} 
+0

¿Estás utilizando sherlock de la barra de acciones? Acabo de comprobar para asegurarme de que tenía el último paquete de soporte, y me di cuenta de que estoy usando el sherlock de la barra de acciones. Actualicé el último ABS, pero sigo teniendo el problema. ¿No estoy seguro de si ABS es el culpable? – James

+1

Acabo de probar EU4You de Mark Murphy (https://github.com/commonsguy/cw-android/tree/master/Fragments/EU4You_6) con la biblioteca de soporte normal y también con ActionBarSherlock. Invocó a SaveInstanceState y pasó el paquete a onActivityCreated como se esperaba en ambos casos. Entonces, todavía necesito identificar la causa de esto. – James

Respuesta

67

Finalmente descubrí el problema, al menos en mi caso. Tuve un onSaveInstanceState anulado en mi FragmentActivity que no llamó al super.onSaveInstanceState(Bundle outState). Una vez que agregué eso, el Fragment.onSaveInstanceState(Bundle outState) funcionó normalmente.

+7

Hehehe ... y eso también es un error en EU4You_6. ¡Gracias por publicar esto! – CommonsWare

+0

Disculpa, esta es la respuesta, pero ¿puedes explicar más acerca de esta respuesta, yo también estoy enfrentando este problema? Muchas gracias, – famfamfam

-5

Intente llamar setRetainInstance(true) en onCreate(Bundle savedInstanceState).

+0

No funciona :(. Voy a utilizar SharedPreferences ... Gracias de todos modos – jul

+1

¿Cuándo esperas que se llame 'onSaveInstanceState'? Tal vez simplemente no lo estás desencadenando correctamente. – Felix

+0

Espero que se llame cuando salga del Actividad para guardar algunos datos al volver atrás. ¿Eso es correcto? – jul

6

Una cosa que debe verificar es asegurarse de que la Actividad que contiene el fragmento no impida un reinicio al incluir el indicador android:configChanges en AndroidManifest.xml.

+0

¿Por qué está relacionado? –

+1

sí hombre, resolvió mi problema :) – Laurent

21

Me encontré con la misma pregunta e intenté con el método SaveInstanceState(), pero no funcionó.

Creo que onSaveInstanceState() solo funciona para el escenario en que el usuario salta de una actividad a otra y viceversa, no funciona en el escenario en que el usuario salta entre fragmentos en la misma actividad.

aquí está el documento guía de Google. http://developer.android.com/guide/components/tasks-and-back-stack.html#ActivityState

+3

, eso es verdad. Fragment.onSaveInstanceState no se invocará hasta que la actividad que lo aloja necesite guardar su estado como se indica aquí: http://developer.android.com/reference/android/app/Fragment.html#onSaveInstanceState(android.os.Bundle) – saulobrito

+2

Entonces, ¿qué debo hacer si me gustaría guardar los datos en el fragmento actual? – benleung

+1

@benleung, me gustaría utilizar un objeto que tiene un ciclo de vida independiente en comparación con el fragmento para guardar los datos.Por ejemplo, un administrador de datos único, un servicio fijo, o incluso las Preferencias Compartidas o un Archivo, las dos últimas pueden no ser las mejores opciones debido a la sobrecarga. – Zephyr

4

En algunas situaciones, puede resultarle útil utilizar fragmentos de argumentos en lugar de savedInstanceState. Further explanation.

Cuestiones relacionadas