android - sola - Perder datos cuando gira la pantalla
mantener los datos cuando rotemos la pantalla en android (7)
Tengo un pequeño error gracioso en mi aplicación. Cuando el usuario gira la pantalla, pierdo algunos de los datos en mi actividad. ¿Alguien que tenga una idea de por qué sucede esto?
Sigue estos dos pasos
1) Guarde los datos en onSaveInstance:
protected void onSaveInstanceState (Bundle outState) {
super.onSaveInstanceState(outState);
outState.putCharSequence(EDIT_TEXT_VALUE, mTextView.getText()); //<-- Saving operation
}
2) Recuperar datos en onCreate:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mTextView = (TextView) findViewById(R.id.editText);
// Retrieving logic
if (savedInstanceState != null) {
CharSequence savedText = savedInstanceState.getCharSequence(EDIT_TEXT_VALUE);
mTextView.setText(savedText);
}
}
Un punto a tener en cuenta aquí es cuando la actividad se llama por primera vez, luego el paquete en el parámetro del método onCreate () es nulo, pero cuando se recrea la actividad, el paquete no es nulo.
¿Por qué se pierden datos cuando la pantalla gira?
El sistema operativo Android intenta elegir los recursos más adecuados cuando se dibuja una actividad.
Pocos ejemplos de recursos múltiples.
Recurso de imagen: debe tener avisos de varias carpetas para los mismos archivos de imagen hdpi, mdpi, xxhdpi, etc.
Recurso de diseño: si ha creado un diseño para el modo horizontal en la carpeta layout-land.
OS es responsable de elegir el recurso más apropiado entre todos los recursos disponibles posibles, por lo que no tiene que preocuparse por ello.
Aquí hay una variación de la respuesta útil de @ jaisonDavis:
int myInt;
String myString;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_verses);
if (savedInstanceState == null) {
Intent intent = getIntent();
myInt = intent.getIntExtra("MyIntIntentKey", DEFAULT_INT);
myString = intent.getStringExtra("MyStringIntentKey", DEFAULT_STRING);
} else { // savedInstanceState has saved values
myInt = savedInstanceState.getInt("MyIntKey");
myString = savedInstanceState.getString("MyStringKey");
}
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putInt("MyIntKey", myInt);
savedInstanceState.putString("MyStringKey", myString);
super.onSaveInstanceState(savedInstanceState);
}
En este ejemplo, las variables se inicializan desde un Intent
la primera vez que se crea la actividad, pero luego se inicializan desde savedInstanceState
(como cuando cambia la orientación).
De forma predeterminada, cuando se gira la pantalla, su actividad se cancela y se reinicia. Para asegurarse de que no se pierden datos, debe guardar y restaurar adecuadamente sus datos utilizando los métodos del ciclo de vida. Consulte Cómo guardar el estado persistente .
En AndroidManifest.xml agrega el siguiente código
<activity android:name=".MainActivity" android:configChanges="keyboardHidden|orientation|screenSize" >
La solución más rápida que he encontrado es la siguiente: http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange
//Use onSaveInstanceState(Bundle) and onRestoreInstanceState
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save UI state changes to the savedInstanceState.
// This bundle will be passed to onCreate if the process is
// killed and restarted.
savedInstanceState.putBoolean("MyBoolean", true);
savedInstanceState.putDouble("myDouble", 1.9);
savedInstanceState.putInt("MyInt", 1);
savedInstanceState.putString("MyString", "Welcome back to Android");
// etc.
super.onSaveInstanceState(savedInstanceState);
}
//onRestoreInstanceState
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// Restore UI state from the savedInstanceState.
// This bundle has also been passed to onCreate.
boolean myBoolean = savedInstanceState.getBoolean("MyBoolean");
double myDouble = savedInstanceState.getDouble("myDouble");
int myInt = savedInstanceState.getInt("MyInt");
String myString = savedInstanceState.getString("MyString");
}
Así es como guarda sus datos cuando el sistema los elimina al girarlos.
setRetainInstance(true);
Use esto en OnCreate