2011-08-23 25 views
5

Por lo que he entendido, su actividad de Android se recreará para la nueva orientación en cualquier cambio de orientación.Guardando algunos datos sobre el cambio de orientación en Android

¿Hay alguna manera de almacenar/guardar algunos de los datos de la orientación original en el cambio de orientación?

Me gustaría almacenar algunos mapas de bits, por lo que no tengo que volver a cargarlos en el cambio de orientación.

Respuesta

12

El uso de variables/clases estáticas es un mal enfoque en términos de mantenimiento y eliminación de fallas.


He estado usando Activity.onRetainNonConfigurationInstance pero descubrí hace un momento que este es obsoleto (probablemente desde nido de abeja o posterior). Activity.onRetainNonConfigurationInstance

Usando este método, sólo llame Activity.getLastNonConfigurationInstance para recuperar el mismo objeto que regresó en el onRetainNonConfigurationInstance. Asegúrese de verificar nulo y emitir a la clase correcta (puede devolver/obtener cualquier clase).Activity.getLastNonConfigurationInstance

Un ejemplos de uso en pseudo-código sería:

onRetainNonConfigurationInstance: 
    return "I need to remember this next time"; 

onCreate: 
    ... 
    String messageToShow = null; 
    Object data = getLastNonConfigurationInstance(); 
    if(data != null) 
     messageToShow = (String)data; 
    else 
     messageToShow = "Nothing to show"; 

Por lo tanto, si está destinada a una audiencia de hasta 2.x.x puede usar ese método. De lo contrario, google recomienda que uses Fragment.setRetainInstance. Esto es compatible con versiones anteriores a través del paquete de compatibilidad.

Fragment.setRetainInstance

+0

Derecha, mi 1 punto :) – darma

+0

@Pedro Loureiro Pero esto no funciona para una actividad, solo una perversión, ¿verdad? –

0

El proceso que ejecuta su actividad no se reiniciará. Android Framework solo creará una nueva instancia de tu actividad. Entonces, como solución más simple, puede almacenar sus datos en variables estáticas.

+0

Así, pude básicamente crear las variables como estática y inicializarlas como nulo. Luego, haz un cheque nulo y si no son nulos, los reutilizaré y, si son nulos, los cargaré. ¿Correcto? –

+1

Tenga cuidado con el almacenamiento de variables estáticas; Puede leer este artículo muy interesante de Romain Guy: http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-android/ – darma

+0

Sí, tiene razón. –

5

Guarde los elementos en una actividad primaria o clase de utilidad estática.

De lo contrario, puede usar el manifiesto para indicar a la aplicación que no destruya la actividad en el tamaño de la pantalla. Echa un vistazo a este artículo: http://developer.android.com/guide/topics/resources/runtime-changes.html

+0

Muchas gracias, esto me ayudó mucho y creo que puedo resolver mi problema ahora :-) Lo marcaré como respuesta cuando pueda en unos minutos. –

+0

bien gracias, me alegro de que haya ayudado. – Noah

1

En realidad, hay un artículo muy bueno en el sitio del desarrollador de Android que trata este tema.

Algunos dispositivos, como el T-Mobile G1, pueden cambiar su configuración de hardware en tiempo de ejecución. Por ejemplo, cuando abre el teclado, , la pantalla cambia de la orientación vertical a la orientación horizontal .

Para facilitar el desarrollo de la aplicación Android, el sistema Android maneja automáticamente los eventos de cambio de configuración y reinicia la actividad actual con la nueva configuración.

[...]

Aunque este comportamiento es realmente de gran alcance, ya que su aplicación se adapta automáticamente a configuración del dispositivo en tiempo de ejecución, es veces confuso para los nuevos desarrolladores de Android, que se preguntan por qué su actividad es destruido y recreado

Frente a este "problema" algunos desarrolladores optan por manejar la configuración cambia a sí mismos, que es, en general, una solución a corto plazo que solamente complicará su vida posterior.

[...]

The full article.

0

puede probar a usar SharedPreferences:

editor edit = preferences.edit(); edit.putString("username", "new_value_for_user"); edit.commit();

Cuestiones relacionadas