5

Necesito manejar cambios de orientación en mi aplicación Android. Para este propósito, decidí usar la clase de conveniencia OrientationEventListener. Pero su método de devolución de llamada tiene un comportamiento algo extraño.Problemas al manejar cambios de orientación

Mi aplicación comienza en el modo vertical y luego cambia a la del paisaje. Tengo un código personalizado ejecutándose en el método de devolución de llamada onOrientationChanged que proporciona cierta lógica de manejo de la interfaz de usuario adicional: tiene algunas llamadas al findViewById. Lo que es extraño es que cuando se cambia de modo horizontal a vertical onOrientationChanged devolución de llamada se llama dos veces, y lo que es aún peor - la segunda llamada está tratando con malContext - findViewById método comienza a regresar null. Estas llamadas se realizan desde el TrenzadoPrincipal

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    listener = new OrientationListener(); 
} 

    @Override 
protected void onResume() {  
    super.onResume(); 
    // enabling listening 
    listener.enable(); 
} 
    @Override 
protected void onPause() { 
    super.onPause(); 
    // disabling listening 
    listener.disable(); 
} 

he replicado el mismo comportamiento con un maniquí Activity sin ninguna lógica excepción de uno que se ocupa de hadling orientación. Inicié el cambio de orientación desde el emulador de Android 2.2 presionando Ctrl + F11 ¿Qué podría estar mal?

UPD: clase interna que implementa OrientationEventListener

private class OrientationListener extends OrientationEventListener { 
    public OrientationL() { 
     super(getBaseContext()); 
    } 

    @Override 
    public void onOrientationChanged(int orientation) { 

     toString(); 

    } 
} 

}

+1

favor publicar su código onOrientationChanged demasiado –

+1

¿Has probado esto al probar en un teléfono real? Tuve algunos problemas con los cambios de orientación que solo ocurrieron al probar en un emulador. Tenía algo que ver con el emulador. Fingía cambiar la orientación de la pantalla. También tuve un problema con la recreación de la aplicación dos veces. –

+0

Desafortunadamente, no tengo acceso al teléfono real por ahora – nixau

Respuesta

5

Esto es un error documentado en el emulador SOLAMENTE. Un dispositivo real no exhibirá este comportamiento de doble ciclo de vida de eventos. Tuve el mismo problema hace un tiempo y desaparece en un dispositivo real.

Sugeriría ignorar el problema si solo puede probar los cambios de orientación en una dirección hasta que tenga las manos en un teléfono físico. De lo contrario, es posible que pueda "omitir" el segundo conjunto de llamadas al ciclo de vida manteniendo un booleano estático alrededor que indica que ya ha pasado por el primer conjunto.

Consulte this issue report para obtener más información.

+0

tuvo algunos problemas en Motorola xoom, onCreate también se llama dos veces por fila http://stackoverflow.com/posts/3922257 – RzR

3

¿Ha intentado utilizar onConfigurationChanged?

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
if(newConfig.equals(Configuration.ORIENTATION_LANDSCAPE)… 
+0

Tengo el mismo problema con el método 'findViewById'. Es extraño, pero parece que el diseño declarativo especificado en el archivo '.xml' aún no se ha procesado. – nixau

+0

de todos modos enConfigurationChanged parece ser la mejor solución en comparación con la suscripción de devolución de llamada OrientationEventListener – nixau

1

Añadir androide: configChanges = "orientación" en el archivo de manifiesto en la etiqueta de actividad como

<activity android:label="@string/app_name" android:configChanges="orientation" android:name=".com.androidpeople">

Cuestiones relacionadas