Necesito para aplicar diferentes diseños para orientación vertical y horizontal de mi actividad. Además, necesito mostrar alerta si la orientación es vertical.

He especificado android:configChanges="orientation|keyboardHidden" en el AndroidManifest. Yo también anular onConfigurationChanged método como este:

@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 que la rotación de horizontal a vertical de registro parece:

config changed
Portrait

Pero mientras cambia de vertical a horizontal parece

config changed
Portrait
config changed
Landscape

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

OriginalEl autor darja | 2010-09-25

5 Comentarios

  1. 3

    Ver mi respuesta a otra pregunta aquí: https://stackoverflow.com/a/3252547/338479

    En resumen, el manejo de los cambios de configuración correctamente es difícil de hacer. Es la mejor manera de implementar onRetainNonConfigurationInstance() que se llama justo antes de que su solicitud está a punto de ser detenido y reiniciado debido a un cambio en la configuración. Utilice este método para guardar cualquier cosa que usted desea (‘esto’ es una buena opción) y, a continuación, deje que el sistema de derribar su 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 con su aplicación sin que todos los que ensuciar alrededor con los paquetes y compartido preferencias.

    OriginalEl autor Edward Falk

  2. 1

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

    Si se establece en AndroidManifest.xml android:configChanges a keyboardHidden|orientation para su actividad, onCreate etc… no será llamado. Que hace que la aplicación es mucho más fácil de implementar. Pero, por supuesto, la disposición a cambiar de vertical a horizontal así.

    OriginalEl autor Irek Wisniowski

  3. 0

    ¿Hay alguna razón en particular que usted eligió para la rotación de la manija de esta manera? Si bien es más rápido ya que la actividad no consigue reinicia en un cambio de orientación, que normalmente no se recomienda, si recuerdo correctamente. Otra manera de manejar los cambios de orientación es, en lugar de reemplazar onConfigurationChanged(), 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, a continuación, se especifican dos diseños: uno para retrato, uno de paisaje. La versión vertical de la disposición quedaría en res/layout/whatever.xml, y el paisaje versión en vivo en res/layout-land/whatever.xml. El AndroidGuys había escrito un montón de buenos artículos sobre este tema, consulte http://androidguys.com/?s=rotational+fuerzas&x=9&y=9

    Por qué onConfigurationChanged() mala manera? Por favor podría darme un enlace con la explicación? Si voy a utilizar onCreate() o algo así como que la actividad será recreado y sus datos se perderán.

    OriginalEl autor Chris Fei

  4. 0

    Estoy bastante seguro de que desea utilizar onCreate en lugar de onStart. La única diferencia parece ser que onStart será llamado cuando la solicitud llega a primer plano. Que no sería un caso donde se desea hacer la espera del usuario para volver a inicializar la interfaz de usuario. De lo contrario, acaba de cambiar su setContentView la llamada se basa en que si la condición.

    Estoy de acuerdo con usted, el método onCreate se invoca cuando la orientación de los cambios en los dispositivos
    ¿Por qué es mejor entonces onConfigurationChanged?
    Yo creo que voy a terminar la construcción de su interfaz de usuario dos veces en ese caso. Ambos onConfigurationChange y onCreate recibirá llamada cuando la pantalla rota. Ya tiene a la configuración de la interfaz de usuario en onCreate para todos los demás crean situaciones.
    He notado que si onConfigurationChanged se maneja, no es recrear, onDestroy y onCreate no se llama

    OriginalEl autor JOTN

  5. 0

    Android inicia una nueva instancia de su actividad al cambiar de orientación para el uso de onCreate es el método ideal. Tendrá que guardar/restaurar la actividad de datos, obviamente, con el fin de recoger donde lo dejó, pero usted debe hacer esto de todos modos, ya que cualquier número de eventos puede unfocus/matar a su aplicación.

    ¿Por qué los downvotes? Él está en lo correcto.

    OriginalEl autor methodin

Dejar respuesta

Please enter your comment!
Please enter your name here