Respuestas:
Si quieres forzar tu TextView
a guardar su estado debes agregar freezesText
atributo:
<TextView
...
android:freezesText="true" />
De la documentación en freezesText
:
Si está configurada, la vista de texto incluirá su texto completo actual dentro de su carámbano congelado además de metadatos como la posición actual del cursor. Por defecto, esto está desactivado; puede ser útil cuando el contenido de una vista de texto no se almacena en un lugar persistente como un proveedor de contenido
Para retener datos sobre el cambio de orientación, debe implementar los dos métodos:
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// Read values from the "savedInstanceState"-object and put them in your textview
}
@Override
protected void onSaveInstanceState(Bundle outState) {
// Save the values you need from your textview into "outState"-object
super.onSaveInstanceState(outState);
}
1) No todas las vistas con ID guardan su estado. Los widgets de Android, con una identificación, cuyo estado puede ser cambiado por el usuario, parecen guardar su estado en una eliminación suave. Entonces EditText guarda su estado, pero TextView no guarda su estado en un cierre suave.
"AFAIK, Android solo se molesta en guardar el estado para las cosas que se espera que cambien. Es por eso que guarda el texto en un EditText (que es probable que cambie un usuario) y quizás no guarda el estado para un TextView (que normalmente permanece estático ) "
Mark M
Por lo tanto, puede optar por guardar el estado de la vista de texto en onSaveInstanceState y puede optar por restaurar el estado de la vista de texto en onCreate.
2) La mejor práctica es guardar el estado de la instancia sin vista "interna" incluso si declara
android:configChanges= "orientation|keyboardHidden"
De los documentos:
"Sin embargo, tu aplicación siempre debe poder cerrarse y reiniciarse con su estado anterior intacto. No solo porque hay otros cambios de configuración que no puedes evitar para reiniciar tu aplicación, sino también para manejar eventos como cuando el usuario recibe una entrada llamada telefónica y luego regresa a su aplicación ".
JAL
Android no maneja ese tipo de cosas por ti. Ha guardado todos los datos manualmente.
Puede usar en una actividad para guardar valores
@Override
public Object onRetainNonConfigurationInstance() {
HashMap<String, Object> savedValues = new HashMap<String, Object>();
savedValues.put("someKey", someData);
return savedValues;
}
y use algo como esto en el método oncreate de una actividad para cargar los objetos guardados
HashMap < String, Object> savedValues
= (HashMap<String, Object>)this.getLastNonConfigurationInstance();
también puede elegir desactivar el cambio de orientación para una actividad
<activity android:name=".Activity" android:screenOrientation="portrait" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
Modifique sus actividades en AndroidManifest.xml para anular el comportamiento de cambio de orientación agregando esto a su actividad / actividades:
android:configChanges="orientation|keyboardHidden"
Debería verse algo así:
<activity android:name=".activity.LoginActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name">
</activity>
Agréguelos a AndroidManifest.xml
Coloque el nombre de su actividad en el lugar de Activity_Name
<activity android:name="Activity_Name"
android:screenOrientation="sensor"
...
android:configChanges="orientation|keyboardHidden|screenSize">
Esto también funcionará con el cambio de valor de TextField.
solo agrega
android:configChanges="orientation|screenSize"
a su actividad en AndroidManifest.xml.
Cuando la configuración cambia, Android reinicia su actividad de forma predeterminada. Para cambiar esto, debe anular el onConfigurationChanged()
método. Además, debe agregarandroid:configChanges
a su archivo de manifiesto.
Puedes leer más aquí .
Yo también usé
android:configChanges="orientation"
y no funcionó.
Pero luego encontré una solución.
Verifica si tienes la siguiente línea correctamente en tu forma más maníaca:
<uses-sdk android:minSdkVersion="11" android:targetSdkVersion="11" />
asegúrese de que no lea algo como
<uses-sdk android`:minSdkVersion="11" android:targetSdkVersion="15" />`
Lo tenía de la segunda forma en primer lugar, pero cuando lo corrigí, el estado se conservó.