2010-01-09 14 views
17

Ok, entonces leo cómo Android maneja los "cambios de configuración", destruyendo la Actividad activa.configuración modificada (cambio de orientación) y actividades destructivas: ¿así se supone que debería funcionar?

La primera pregunta Realmente quiero saber de Android Team: ¿por qué? Agradecería una explicación sobre cómo fue el razonamiento, porque no lo entiendo =)

En cualquier caso, el hecho de que actúe de esa manera nos pone a todos, como yo lo veo, en un mundo de dolor.

Supongamos que tiene una Actividad que presenta un número de EditText: s, casillas de verificación, etc. Si un Usuario comienza a llenar ese formulario con texto/datos y luego cambia de orientación (u obtiene una Llamada Telefónica), todos ingresan el Usuario hecho se ha ido. No he encontrado ninguna forma de preservar el estado. Eso nos obliga a hacer una codificación extremadamente dolorosa para no perder todos los datos.

Según lo veo, necesita otra clase "no activa" (o "valor-holding" clase quizás) que tiene un campo para cada "elemento de formulario" (EditText, casilla de verificación, etc.).

Para cada "elemento de formulario" que existe, entonces tiene que adjuntar un evento como "onChanged" (o OnTextChanged o algo así) que actualiza el campo correspondiente en el "valor de retención" clase para hacer Asegúrese de que para cada carácter que escriba (en un EditText por ejemplo) se guarde a la vez.

Tal vez se puede utilizar algún oyente (como "OnDestroy" o algo así) y luego llenar la clase de valor de retención de datos ...

También he encontrado this piece of info donde hablan sobre el uso de Bundle, onSaveInstanceState y onRestoreInstanceState, pero eso también significa que el programador tiene que guardar manualmente y luego volver a colocar los valores en el lugar correcto? Este enfoque es un poco menos desordenado que mis sugerencias anteriores, pero aún así no es muy bueno ...

Ahora, alguien puede decirme que estoy totalmente equivocado y que no es así como funciona y que extrañé totalmente algunos ¿información vital? ;-)

Saludos

+1

El marco se encarga de automatizar guardar y restaurar algo del estado; el resto debes hacerlo tú mismo en métodos como 'onPause' y' onResume'. Sé que es difícil darse vueltas al principio, pero realmente necesitas saber el ciclo de vida de una actividad: http://developer.android.com/guide/topics/fundamentals.html#actlife Cambios de configuración como la rotación de la pantalla Necesitamos comenzar de nuevo porque tienen que rediseñar completamente la pantalla. Estoy seguro de que alguien más vendrá y dejará una respuesta adecuada también. :) –

+0

La respuesta principal en la pregunta anterior que vinculó lo resume bastante bien. La forma más fácil de ver lo que se guarda o no durante la rotación o una llamada telefónica, etc., es probarlo en el emulador. –

+1

No entiendo por qué el re-diseño tiene algo que ver con los datos contenidos en las Vistas. El equipo de Android, y todos los demás, siempre hablan de lo importante que es separar la GUI y el código. Entonces, ¿por qué no simplemente volver a dibujar la cosa y guardar los datos? Hay una sugerencia de este tipo aquí: http://stackoverflow.com/questions/456211/activity-restart-on-rotation-android Sugiere anular el onConfigurationChanged y luego solo hacer el setContentView, omitiendo el onCreate ... – Ted

Respuesta

11

Debe leer el Application Fundamentals (específicamente, Activity lifecycle).Dado que Activity s debe ser capaz de manejar ser asesinado en cualquier momento debido a limitaciones de memoria, etc. es solo una forma más limpia de manejar rotaciones sin agregar demasiada complejidad, en lugar de verificar cada recurso por un recurso alternativo, reestructurar el diseño, etc. solo guarda sus datos esenciales, elimina la actividad, la vuelve a crear y vuelve a cargar los datos (si está dispuesto a manejar la complejidad adicional de administrar esto usted mismo, puede usar onConfigurationChanged para manejar el cambio de configuración) usted mismo.) Esto también fomenta mejores prácticas: los desarrolladores deben estar preparados para su Activity para ser asesinados por cambio de orientación, que tiene la (buena) consecuencia de estar preparados para ser asesinados por falta de memoria también.

+1

Thx para la respuesta =) La siguiente pregunta lógica es por qué Android restringe la memoria a 16MB o 32MB ... Su 2010, es hora de darse cuenta de que ya no estamos en los años 80 =) Tengo curiosidad por saber por qué los dispositivos con Windows Mobile (y también ellos tienen sus problemas, lo sé) no se quejan por la memoria. Puedo ejecutar muchas cosas allí, no hay problema. Pero en Android parecen ser hipersensibles al usar RAM ...? – Ted

+2

El tamaño de la memoria es limitado, así como el ancho de banda de * memoria * en dispositivos móviles. 16MB es mucho para trabajar.Tenga en cuenta que es muy poco probable que su aplicación sea eliminada tan pronto como lance otra aplicación (o cinco), pero siempre debe estar preparado para ello; es responsabilidad del desarrollador asegurarse de que el usuario ni siquiera sepa que su aplicación tiene han sido eliminados y reiniciados cuando regresan al punto donde lo dejaron; eso es lo que el marco de Android ofrece y alienta. –

+0

sí, entiendo eso. Pero, una vez más, ¿por qué, por ejemplo, los dispositivos con Windows Mobile pueden actuar como una aplicación "normal", es decir, no destruye las partes de una aplicación "ad hoc"? WinMobile puede hacerlo, y eso es casi el mismo hardware que en los dispositivos Android. Ninguna diferencia. Así que quejarse por la cantidad de RAM y la velocidad realmente no se sostienen en mi opinión ... – Ted

3

en qué parte - respuesta corta - porque es posible que tenga los recursos que necesitaban ser cambiado como se haya girado el teléfono. (Las imágenes, el diseño puede ser diferente, etc.)

Al guardar: puede guardar sus cosas para agruparlas y leerlas nuevamente.

@Override 
    protected void onSaveInstanceState(Bundle outState) { 

      String story_id = "123" 
      outState.putString(ContentUtils.STORYID, story_id); 

    } 

o puede utilizar onRetainNonConfigurationInstance() tal como se describe aquí http://developer.android.com/reference/android/app/Activity.html#onRetainNonConfigurationInstance()

Por último, si usted no tiene nada desea manejar durante la rotación - se puede ignorar que poniendo esto en su actividad manifiesto

android:configChanges="keyboardHidden|orientation" 

En general, leería el artículo de la url por encima de un par de veces, hasta que el ciclo de vida sea claro como el agua.

+1

Thx =) Bueno, como comenté anteriormente: no separan el diseño/GUI de los datos. Si el DISEÑO necesita volver a dibujarse, simplemente eliminan todo. Eso simplemente no está bien =) Realice el redibujado por todos los medios, pero conserve los datos: GUI separada de DATA. Suelen decirlo ellos mismos, pero ahora lo ignoran? – Ted

+0

Bueno, si no tiene nada que cambiar, omita el cambio de orientación. Si lo hace, póngalo en la clase con onRetainNonConfigurationInstance. Además, no lo estoy recomendando, pero puede ignorar el cambio en el manifiesto, y luego en el control de configuración manejado usted mismo –

4

El contenido de un EditText se guardará para usted automáticamente al rotar la pantalla si coloca un atributo android: id en él. De manera similar, si visualiza los diálogos usando Activity # showDialog, los diálogos se vuelven a mostrar después de rotarlos.

+1

Ehm, no lo creo. Tengo una ID en ella, su android: id = "@ + id/EditText01" y eso no lo hace guardar automáticamente ... – Ted

+2

El comportamiento predeterminado de guardar el estado de las vistas con identificadores está documentado aquí: http://developer.android.com/intl/fr/reference/android/app/Activity.html#onSaveInstanceState%28android.os.Bundle%29 También lo he visto funcionar en la práctica. Si no está viendo este comportamiento, entonces lo está bloqueando de alguna manera. Por ejemplo, si invalida onCreate o onRestoreInstanceState y no llama al supermétodo con el paquete provisto, o anula onSaveInstanceState y no llama al supermétodo para agregarlo al paquete. –

+0

Puedo confirmar el comportamiento descrito, el estado de la pantalla se restaura después de la rotación, en un dispositivo físico Android 1.6 (Xperia X10), sin embargo, en el emulador de Android 1.6 que estoy usando, el estado de la pantalla se pierde cuando emulo la rotación con ctrl-F11 . – user77115

Cuestiones relacionadas