Maneje la rotación de la pantalla sin perder datos – Android

Me estoy volviendo loco averiguando cuál es la mejor manera de manejar la rotación de pantalla. Leí cientos de preguntas / respuestas aquí, pero estoy realmente confundido.

¿Cómo puedo guardar los datos de myClass antes de que la actividad se vuelva a crear para poder guardar todo para volver a dibujar la actividad sin otra inicialización inútil?

¿Hay una manera más limpia y mejor que la que se puede vender por plots?

Necesito manejar la rotación porque quiero cambiar el diseño en modo Paisaje.

public class MtgoLifecounterActivity extends Activity { MyClass myClass; // Called when the activity is first created @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); If ( ?? first run...myClass == null ? ) { myClass = new MyClass(); } else { // do other stuff but I need myClass istance with all values. } // I want that this is called only first time. // then in case of rotation of screen, i want to restre the other instance of myClass which // is full of data. } 

puede usar el método de anulación onSaveInstanceState() y onRestoreInstanceState() . o para dejar de invocar onCreate() en la rotación de la pantalla, simplemente agregue esta línea en su manifiesto xml android:configChanges="keyboardHidden|orientation"

Nota: su clase personalizada debe implementar el ejemplo Parcelable continuación.

 @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable("obj", myClass); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onRestoreInstanceState(savedInstanceState); myClass=savedInstanceState.getParcelable("obj")); } public class MyParcelable implements Parcelable { private int mData; public int describeContents() { return 0; } /** save object in parcel */ public void writeToParcel(Parcel out, int flags) { out.writeInt(mData); } public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public MyParcelable createFromParcel(Parcel in) { return new MyParcelable(in); } public MyParcelable[] newArray(int size) { return new MyParcelable[size]; } }; /** recreate object from parcel */ private MyParcelable(Parcel in) { mData = in.readInt(); } } 

En Activity Tag of Manifest deberías mencionar

  

Si usa Android 2.3 (nivel de API 13) y uso anterior

  

Debería funcionar.

Funcionará solo con la etiqueta de actividad y no con la etiqueta de la aplicación

Puede que esto ya esté resuelto, pero solo para una pequeña actualización para los nuevos miembros que se quedaron, simplemente eche un vistazo al Sitio para Desarrolladores de Google , desde el nivel 13 de API, solo necesita agregar este código a Manifiesto:

  

cuando una de estas configuraciones cambia, SplashScreensActivity no se reinicia. En cambio, SplashScreensActivity recibe una llamada a onConfigurationChanged (). A este método se le pasa un objeto de Configuración que especifica la nueva configuración del dispositivo. Al leer los campos en la Configuración, puede determinar la nueva configuración y realizar los cambios apropiados actualizando los recursos utilizados en su interfaz. En el momento en que se llama a este método, el objeto Resources de su actividad se actualiza para devolver recursos según la nueva configuración, de modo que puede restablecer fácilmente los elementos de su UI sin que el sistema reinicie su actividad.

El problema aquí es que está perdiendo el “estado” de la aplicación. En OOP, ¿qué es un estado? Las variables! ¡Exactamente! Por lo tanto, cuando pierdes los datos de tus variables.

Ahora esto es lo que puedes hacer, descubre las variables que están perdiendo sus estados.

enter image description here

Cuando gira su dispositivo, su actividad actual se destruye por completo, es decir, pasa porSaveInstanceState () onPause() onStop() onDestroy() y se crea completamente una nueva actividad que pasa por onCreate() onStart() onRestoreInstanceState .

Los dos métodos en negrita, onSaveInstanceState () guarda la instancia de la actividad presente que se va a destruir. onRestoreInstanceState Este método restaura el estado guardado de la actividad anterior. De esta forma no perderás tu estado previo de la aplicación.

Aquí es cómo usa estos métodos.

  @Override public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) { super.onSaveInstanceState(outState, outPersistentState); outState.putString("theWord", theWord); // Saving the Variable theWord outState.putStringArrayList("fiveDefns", fiveDefns); // Saving the ArrayList fiveDefns } @Override public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState) { super.onRestoreInstanceState(savedInstanceState, persistentState); theWord = savedInstanceState.getString("theWord"); // Restoring theWord fiveDefns = savedInstanceState.getStringArrayList("fiveDefns"); //Restoring fiveDefns } 

Hay dos (buenas) formas de esto. Haga que su clase implemente Parcelable y póngalo en un paquete en onSaveInstanceState() , o, si es más complejo (por ejemplo, una AsyncTask), onRetainNonConfigurationInstance() .

Luego también está la manera perezosa donde simplemente dejas de reactjsr a los cambios de configuración.

Si no necesita reiniciar su actividad, simplemente configure el atributo configChanges en su actividad en AndroidManifest.xml para esto:

  android:configChanges="keyboard|keyboardHidden|orientation" 

Esto le dirá al sistema operativo que se encargará de manejar una rotación y no reiniciará su actividad. El uso de este método eliminará la necesidad de que tenga que guardar cualquier tipo de estado.