2011-06-23 35 views
36

Tengo problemas para decirle a Android que no llame al onCreate() cuando cambie la orientación. He agregado android:configChanges="orientation" a mi manifiesto pero aún cuando se cambia la orientación se llama onCreate(). Aquí está mi código.Android onConfigurationChanged no se llama

AndroidManifest.xml

<activity android:name="SearchMenuActivity" android:theme="@android:style/Theme.NoTitleBar" android:configChanges="orientation"></activity> 

SearchMenuActivity.java

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // Set the current layout to the search_menu 
    setContentView(R.layout.search_menu_activity); 

    Log.d(TAG, "onCreate() Called"); 
} 
@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    //don't reload the current page when the orientation is changed 
    Log.d(TAG, "onConfigurationChanged() Called"); 
    super.onConfigurationChanged(newConfig); 
} 

Y mi LogCat salida

06-23 12:33:20.327: DEBUG/APP(2905): onCreate() Called 
//Orientation Changes 
06-23 12:33:23.842: DEBUG/APP(2905): onCreate() Called 

¿Alguien sabe lo que estoy haciendo mal? Gracias.

Respuesta

51

Un par de cosas para probar:

android:configChanges="orientation|keyboardHidden|screenSize" en lugar de android:configChanges="orientation"

Asegúrese de que no está llamando setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); en cualquier lugar. Esto causará que el Cambio de configuración() no se active.

Compruebe que no esté utilizando android:screenOrientation en su manifiesto.

Si nada de eso funciona, lea el documento de Android sobre cómo manejar los cambios de tiempo de ejecución y asegúrese de que está haciendo todo correctamente. Puede haber algo más en su código que esté causando el problema. http://developer.android.com/guide/topics/resources/runtime-changes.html

EDITAR: Como señaló Derrick, supuse que estaba cambiando la configuración con el acelerómetro detectando la dirección del dispositivo. Si desea que la configuración cambie a medida que se muestra/oculta el teclado, configChanges en el manifiesto también debe incluir keyboardHidden.

+6

para mí, el truco era usar android: configChanges = "orientation | keyboardHidden | screenSize" –

5

debe cambiar la entrada configChanges en AndroidManifest.xml a:

android:configChanges="keyboardHidden|orientation" 

De lo contrario, deslizando el teclado no se activa onConfigurationChange() a pesar de los cambios de orientación. Acabo de probar esto en mi HTC Desire Z.

+0

En mi caso, solo funcionó cuando agregué "| screenSize". –

+0

esta respuesta ya no es válida, debido a cambios en el SDK – Entreco

78

Esta fue mi Gremlin para el ~ mismo problema:

Precaución: A partir de Android 3.2 (API nivel 13), el "tamaño de la pantalla" también cambia cuando el dispositivo cambia entre orientación vertical y horizontal . Por lo tanto, si se quiere evitar un rearranque de tiempo de ejecución debido a cambio de orientación en el desarrollo de API de nivel 13 o superior (como declarado por el minSdkVersion y atributos targetSdkVersion), que debe incluir el valor "ScreenSize" además de la "orientación" valor. Es decir, debe descartar android: configChanges = "orientation | screenSize". Sin embargo, si su aplicación se dirige al nivel API 12 o inferior, su actividad siempre maneja este cambio de configuración (este cambio de configuración no reinicia su actividad, incluso cuando se ejecuta en un dispositivo Android 3.2 o superior).

(De http://developer.android.com/guide/topics/resources/runtime-changes.html)

TL; DR: añadir "| ScreenSize" para android: configChanges = "orientación" para la API 14+

+7

+1 ¡usted es el hombre! – lorenzoff

+2

Impresionante ... después de cambiar mi targetSdkVersion de 8 a 14 me preguntaba por qué onConfigurationChanged() no se estaba llamando. – dell116

+0

Gracias ... me ayudó mucho ... – Rekha

10

Probar Usar éste .....

android:configChanges="orientation|keyboardHidden|screenSize" 
4

Agregue esto a su manifiesto para cada actividad.

android:configChanges="keyboardHidden|orientation|screenSize" 

Entonces, anular onConfigurationChanged en su actividad como tal

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
} 
1

No se desencadena en mi Fragment (Fragments no están registrados en el AndroidManifest.xml) así que tuve que moverlo a la Activity manejando mi Fragment, en mi caso el TabsPagerActivity.

1

Manifiesto:

<activity 
     android:name=".MainActivity" 
     android:configChanges="orientation|keyboardHidden|screenSize"> 
</activity> 

Actividad & Fragmento:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    Log.d(TAG, "onConfigurationChanged " + 
       (newConfig.orientation 
       == Configuration.ORIENTATION_LANDSCAPE 
       ? "landscape" : "portrait")); 
} 

Salida:

10-29 21:53:26.951 D/FragmentOne: onConfigurationChanged landscape 

10-29 21:53:26.951 D/MainActivity:onConfigurationChanged landscape 
1

Pocas cosas pueden ser comprobación cruzada:

En mi caso estaba rastreando el cambio de idioma del dispositivo usando onConfigurationChanged.

Pocas cosas necesitan saber acerca deConfigurationChanged hay alguna diferencia en el comportamiento entre onConfigurationChanged de Actividad y Aplicación.

Al cambiar la configuración del dispositivo, se llamará de forma automática e inmediata al nivel de la aplicación en ConfiguraciónCambiado, pero a la actividad LlamadaConfiguraciónCambiada se le llamará cuando navegue a esa actividad.

y otra cosa es única localidad en el manifiesto no funcionará en algún momento lo que tiene declarar otro evento de cambio de configuración, junto con la configuración regional (en mi caso) que debe ser como androide: configChanges = "layoutDirection | locale"

Cuestiones relacionadas