Fragmento de Android que no guarda el estado

Hace poco convertí mi aplicación de una aplicación basada en actividad a una aplicación basada en fragmentos. Es una aplicación de mantenimiento de puntuación, y yo era fácilmente capaz de guardar y restaurar la puntuación cuando se trataba de una actividad. Sin embargo, eso no parece funcionar como un fragmento. Aquí está mi código:

@Override public void onSaveInstanceState(Bundle savedInstanceState){ super.onSaveInstanceState(savedInstanceState); if(t!=null&&flag==1){ savedInstanceState.putInt("time", t.getTimeLeft()); } else { savedInstanceState.putInt("time", 0); } savedInstanceState.putIntArray("score_array", points); savedInstanceState.putIntArray("position_array", spinnerPosition); savedInstanceState.putBooleanArray("checked_array", shouldBeChecked); flag = 0; Log.d("MyApp", "savingState"); } @Override public void onActivityCreated(Bundle savedInstanceState){ super.onActivityCreated(savedInstanceState); Log.d("MyApp", "onActivityCreated"); try { int timeLeft = savedInstanceState.getInt("time"); points = savedInstanceState.getIntArray("score_array").clone(); spinnerPosition = savedInstanceState.getIntArray("position_array").clone(); shouldBeChecked = savedInstanceState.getBooleanArray("checked_array").clone(); ((BaseAdapter) ((ListView)getView().findViewById(R.id.missionList)).getAdapter()).notifyDataSetChanged(); if(timeLeft!=0){ flag=1; this.getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); t = new TimerClass(timeLeft*1000, 1000); t.setViews((TextView)getView().findViewById(R.id.minuteView), (TextView)getView().findViewById(R.id.tenSecondView), (TextView)getView().findViewById(R.id.secondView), (Button)getView().findViewById(R.id.start_button)); ((Button)getView().findViewById(R.id.start_button)).setText(R.string.stop); t.start(); } } catch (Exception e) { e.printStackTrace(); } } 

Utilicé exactamente este mismo código con éxito en una actividad en onRestoreInstanceState en lugar de onActivityCreated y sin try / catch. El problema es que estoy recibiendo errores de puntero nulo una vez que trato de sacar algo del paquete. Puedo ver el estado de ahorro en el registro, y entonces onActivityCreated, pero onActivityCreated no parece conseguir el material puesto en el paquete por el onSavedInstanceState. Acabo de obtener un puntero nulo en cada línea que llama a savedInstanceState.getAnything() . Sin embargo, a partir de mi lectura, onCreate , onCreateView y onActivityCreated utilizan todos el mismo paquete. He intentado mover el código a los otros dos sin suerte.

Terminé subiendo con un trabajo bastante hacky alrededor. No emocionado con él, ya que no es realmente la solución del problema central. Si alguien me puede ayudar a encontrar eso, me gustaría aceptar esa respuesta sobre esto.

Dicho esto, simplemente usé el onSaveInstanceState de la actividad y onRestoreInstanceState para guardar y restaurar los datos del fragmento.

Para cualquiera que necesite una mejor respuesta:

Siempre pruebe if(savedInstanceState!=null) antes de acceder a él, para evitar errores de puntero nulo. Además, tenga en cuenta que onSaveInstanceState () no podrá guardar sus datos en todos los casos en que su fragmento se destruya.

Particularmente si su Fragmento es empujado sobre la pila trasera, y el dispositivo es girado. En este caso, sólo se llama a onDestoryView () cuando el Fragmento se inserta en la pila posterior, por lo que cuando se ejecuta OnSaveInstanceState () durante la rotación del dispositivo, no podrá guardar ningún dato de las Vistas porque todas fueron destruidas anteriormente.

Consulte el siguiente subproceso para un trabajo alrededor. Creo que es útil para todos los que se desarrollan con Fragments. Especialmente la respuesta de DroidT : https://stackoverflow.com/a/19744402/2517350

  • Android: guarda un estado de instancia cuando se cierra la aplicación
  • Restauración de la vista SavedState lanza ClassNotFoundException al desmarcar la vista principal SavedState
  • Estado de restauración después de que el proceso se destruye
  • Cómo guardar el estado de la instancia del radiobutton seleccionado en el menú
  • Cómo usar el ejemplo de onSavedInstanceState por favor
  • ¿Cómo guardar el estado de un Android CheckBox cuando los usuarios salen de la aplicación?
  • Guardar el estado cuando se pulsa el botón Atrás
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.