¿Restaurando el estado de TextView después de la rotación de la pantalla?

104

En mi aplicación tengo TextViewy EditText. Ambos contienen datos. Cuando la orientación de la pantalla cambia, los datos EditTextquedan, pero los TextViewdatos se borran.

¿Alguien puede ayudarme a encontrar una manera de retener datos TextViewtambién?

KanNaN
fuente

Respuestas:

221

Si quieres forzar tu TextViewa guardar su estado debes agregar freezesTextatributo:

<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

inazaruk
fuente
13
¿Por qué el texto no está 'congelado / guardado' por defecto como otros atributos (selección de texto, posición del cursor, etc.)? En otras palabras, ¿en qué escenario sería que alguien realmente preferiría que el texto se no guarda?
Gautam
3
@Gautam, mi conjetura sería que a menudo los TextViews se crean a partir de cadenas estáticas almacenadas en XML, en cuyo caso es redundante que el sistema recuerde los valores.
anderspitman
3
En realidad, una vez que le da a EditText o TextView una identificación, el valor persistirá durante un evento de rotación de pantalla.
DoctorFox
7
@jegesh - desafortunadamente este no es el caso de TextViews al menos en algunos dispositivos (Jellybean)
Bö macht Blau
1
No funciona para mí, al menos no en un dispositivo de API 17
Ab
28

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);
}
Eric Nordvik
fuente
5
¿Por qué usar onRestoreInstanceState cuando el mismo paquete está disponible en onCreate?
slott
4
@slott Consulte esta documentación. developer.android.com/training/basics/activity-lifecycle/… Esto es una conjetura, pero sospecho que se debe a que el sistema realiza un seguimiento de si está creando una nueva actividad o recreando una antigua. onRestorySavedInstance solo se llama en circunstancias más raras: cambios de configuración y destrucción de actividad debido a limitaciones de memoria.
Gusdor
6

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

JAL
fuente
6

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>
Kevin
fuente
no se puede anular onRetainNonConfigurationInstance () en android.support.v4.app.fragmentActivity; ¡el método anulado es final!
Akash Dubey
1

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>
Joakim Berglund
fuente
27
En general, la documentación no recomienda este enfoque : "El uso de este atributo debe evitarse y usarse solo como último recurso. Lea Manejo de cambios en tiempo de ejecución ..."
idbrii
1

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.

Rahul Krishna
fuente
1

solo agrega

android:configChanges="orientation|screenSize"

a su actividad en AndroidManifest.xml.

farhad.kargaran
fuente
-2

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í .

Vladimir Ivanov
fuente
-7

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ó.

Optimus
fuente
1
Esto es algo completamente diferente. Target SDK es hacer que su aplicación sea compatible con la mayoría de los rangos de sistemas operativos Android. Esta no es una respuesta, de alguna manera esto puede haber funcionado en su caso, pero esta no es una solución adecuada.
Rohan Kandwal