5

Necesito aplicar diferentes diseños para las orientaciones vertical y horizontal de mi actividad. Además, necesito mostrar alerta si la orientación es retrato.Actividad de manipulación rotando en Android

He especificado android:configChanges="orientation|keyboardHidden" en AndroidManifest. También puedo reemplazar el método onConfigurationChanged así:

@Override 
public void onConfigurationChanged(Configuration newConfig) 
{ 
    Log.d("tag", "config changed"); 
    super.onConfigurationChanged(newConfig); 

    int orientation = newConfig.orientation; 
    if (orientation == Configuration.ORIENTATION_PORTRAIT) 
     Log.d("tag", "Portrait"); 
    else if (orientation == Configuration.ORIENTATION_LANDSCAPE) 
     Log.d("tag", "Landscape"); 
    else 
     Log.w("tag", "other: " + orientation); 

    .... 
} 

Mientras gira de horizontal a registro retrato se parece a:

config changed 
Portrait 

Pero mientras se cambia de vertical a horizontal se ve como

config changed 
Portrait 
config changed 
Landscape 

Por qué onConfigurationChanged se llama dos veces? ¿Cómo puedo evitarlo?

Respuesta

3

Véase mi respuesta a otra pregunta aquí: https://stackoverflow.com/a/3252547/338479

En resumen, el manejo de los cambios de configuración correcta es difícil de hacer. Lo mejor es implementar onRetainNonConfigurationInstance() que se llama justo antes de que su aplicación esté por detenerse y reiniciarse debido a un cambio de configuración. Utiliza este método para guardar lo que quieras ('esta' es una buena opción) y luego deja que el sistema cierre tu aplicación.

Cuando su aplicación se reinicia con la nueva configuración, utilice getLastNonConfigurationInstance() para recuperar el estado que acaba de guardar, y utilizarlo para continuar su aplicación sin todo lo que curioseaba con paquetes y preferencias compartidas.

0

¿Hay alguna razón en particular por la que eligió manejar la rotación de esta manera? Si bien es más rápido ya que la actividad no se reinicia en un cambio de orientación, normalmente no se recomienda, si no recuerdo mal. Otra manera de manejar los cambios de orientación es en lugar de primordial , anulando onCreate(), onStart() o onResume() tal que

@Override 
public void onStart() { 
    super.onStart(); 
    int orientation = getWindowManager().getDefaultDisplay().getOrientation(); 
    if(orientation == Configuration.ORIENTATION_PORTRAIT) { 
     Log.i(TAG, "Orientation is portrait"); 
     // show whatever alerts here 
    } 
} 

y especificando dos diseños - uno para retrato, uno para paisaje. La versión vertical del diseño permanecería en res/layout/whatever.xml, y la versión horizontal viviría en res/layout-land/whatever.xml. Los AndroidGuys habían escrito un montón de buenos artículos sobre este tema, ver http://androidguys.com/?s=rotational+forces&x=9&y=9

+0

¿Por qué onConfigurationChanged() es una mala manera? ¿Podría darme un enlace con una explicación? Si usaré onCreate() o algo así, la actividad será recreada y sus datos se perderán. – darja

0

Estoy bastante seguro de que querrías usar onCreate en vez de onStart. La única diferencia parece ser que se llamará a OnStart cuando la aplicación pase a primer plano. Ese no sería un caso en el que le gustaría hacer que el usuario espere a que reinicialice la IU. De lo contrario, simplemente cambie su llamada setContentView en función de esa condición.

+0

Estoy de acuerdo con usted, el método onCreate se invoca cuando la orientación del dispositivo cambia –

+0

¿Por qué es mejor que onConfigurationChanged? – darja

+0

Creo que terminarás construyendo tu IU dos veces en ese caso. Tanto onConfigurationChange como onCreate recibirán una llamada cuando la pantalla gire. Ya debe configurar la IU en onCreate para todas las demás situaciones de creación. – JOTN

0

Android inicia una nueva instancia de su actividad al cambiar la orientación, por lo que usar onCreate es el método ideal. Tendrás que guardar/restaurar los datos de tu actividad obviamente para continuar donde lo dejaste, pero deberías estar haciendo esto de todos modos ya que cualquier cantidad de eventos puede desenfocar/matar tu aplicación.

+0

¿Por qué los votos hacia abajo? El tiene razón. –

1

Simplemente puede guardar la orientación anterior y comprobar si realmente ha cambiado.

Si configura en AndroidManifest.xmlandroid:configChanges en keyboardHidden|orientation para su actividad, onCreate etc ... no se ejecutará. Eso hace que la implementación sea significativamente más fácil de implementar. Pero, por supuesto, el diseño también cambiará de vertical a horizontal.

Cuestiones relacionadas