6

Tengo una actividad pequeña con EditText y una vista de imagen y un botón. Cuando presiona el botón, inicia la cámara para obtener el resultado y, cuando vuelve, cambia la vista de la imagen a la que acaba de tomar.Mis puntos de vista se restablecen en el cambio de orientación

Pero cuando cambia la orientación, la vista de la imagen se restablece a la predeterminada en el diseño.

Lo que intenté hacer fue configurar un booleano llamado personalizado, y cuando toma una imagen lo establece en verdadero. Anulo onConfigurationChanged() y si personalizado se establece en verdadero, restauro la imagen.

Mi problema ahora es que se borra EditText - ¿Cómo puedo restaurar EditText después de cambiar la configuración? Mi primer intento fue almacenar su contenido en un String onPause() y luego restaurarlo, pero siempre aparece en blanco.

Respuesta

14

Por lo general, cuando la vista de la IU no mantiene su estado, lo primero que debe verificar es que esta vista de IU tiene una identificación asignada. Sin este ID, las vistas no pueden restaurar su estado.

<EditText android:id="@+id/text" ... /> 

Si esto no ayuda, es necesario guardar y restaurar el estado mismo. Eche un vistazo al Handling Runtime Changes. Es más o menos explica lo que debe hacer:

Para manejar adecuadamente un reinicio, es importante que su actividad restaura su estado anterior a través del ciclo de vida de la actividad normal, en el que Android llamadas onSaveInstanceState() antes de que destruya su actividad de manera que se puede guardar datos sobre el estado de la aplicación. Luego puede restaurar el estado durante onCreate() o onRestoreInstanceState(). Para probar que su aplicación se reinicia con el estado de la aplicación intacto, debe invocar los cambios de configuración (como cambiar la orientación de la pantalla) mientras realiza varias tareas en su aplicación.

Debe anular onSaveInstanceState() y guardar su estado Acitivity cuando su llamada:

@Override 
protected void onSaveInstanceState(Bundle outState) 
{ 
    super.onSaveInstanceState(outState); 
    outState.putString("textKey", mEditText.getText().toString()); 
} 

Y luego restaurar el estado en onCreate() o onRestoreInstanceState():

public void onCreate(Bundle savedInstanceState) 
{ 
    if(savedInstanceState != null) 
    { 
     mEditText.setText(savedInstanceState.getString("textKey")); 
    } 
} 

Si esto no es todavía suficiente, puede anular onRetainNonConfigurationInstance() y devolver cualquier objeto personalizado que será pa ssed al nuevo objeto de actividad, cuando se recrea. Se pueden encontrar más detalles sobre cómo usarlo en Handling Runtime Changes. Pero esta función está en desuso en Android 3.0+ (específicamente para FragmentActivity donde es su final). Entonces esto no se puede usar junto con los Fragmentos (lo cual está bien, tienen su mecanismo para retener objetos a través de los cambios de configuración).


Y la última - nunca use android:configChanges. Debe tener muy buenas razones para usarlo, y generalmente estos son motivos de rendimiento. No estaba destinado a ser abusado de la manera que es ahora: solo para prevenir el reinicio del estado de la IU. Si se utiliza este atributo, entonces sí, la IU de actividad no se volverá a configurar en el cambio de configuración, pero el estado de Actividad aún se restablecerá cuando se destruya y vuelva a crearse más tarde.

La documentación explica esta opción bastante bien:

Nota: La capacidad cambiar la configuración usted mismo puede hacer que sea mucho más difícil de usar recursos alternativos, debido a que el sistema no aplicará automáticamente para usted. Esta técnica debe ser considerado un último recurso y no se recomienda para la mayoría de aplicaciones

+0

De acuerdo, parece un enfoque mucho mejor. Puedo usar esto para el mapa de bits en su lugar, y luego el texto de edición no será un problema. Pero, ¿qué función usaría para guardar el estado de la imagen? – Sebastian

+0

Si el mapa de bits se guarda en el disco, simplemente guarde la ruta al mapa de bits en la función 'onSaveInstanceState()'. Si el mapa de bits está en la memoria, puede usar 'onRetainNonConfigurationInstance()'. – inazaruk

4

Puede obligar a su actividad a no volver a cargar después de cambiar la orientación agregando android:configChanges="orientation" a su línea de actividad en manifiesto.

+0

Pero no habría que hacer que la actividad se ajusta al teléfono estar de lado? – Sebastian

+0

Esta es la respuesta correcta. El que impide que la pantalla cambie de orientación es 'android: screenOrientation =" portrait "' –

+4

Si bien esto soluciona este caso particular, no soluciona el problema subyacente. Y 'android: configChanges' se considera como último recurso, y normalmente nunca debería usarse. http://developer.android.com/guide/topics/resources/runtime-changes.html – inazaruk

Cuestiones relacionadas