41 votes

Android onConfigurationChanged ne pas être appelé

J'ai du mal à dire à Android de ne pas appeler onCreate() lorsque l'orientation change. J'ai ajouté android:configChanges="orientation" à mon manifeste, mais quand les changements d'orientation changent, on appelle onCreate() . Voici mon code.

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);
}
 

Et ma sortie LogCat

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

Est-ce que quelqu'un sait ce que je fais mal? Merci.

81voto

nmr Points 5504

C'était mon gremlin pour le ~même problème:

Attention: Début avec Android 3.2 (API level 13), la "taille de l'écran" change également lorsque l'appareil commute entre les modes portrait et paysage de l'orientation. Ainsi, si vous souhaitez empêcher l'exécution redémarre en raison de changement d'orientation lors de l'élaboration de l'API de niveau 13 ou supérieur (comme déclaré par le minSdkVersion et targetSdkVersion attributs), vous doit inclure le "screenSize" valeur en plus de "l'orientation" de la valeur. C'est, vous devez decalare android:configChanges="orientation|screenSize". Toutefois, si votre l'application des objectifs de l'API de niveau 12 ou moins, puis votre activité toujours les poignées de ce changement de configuration lui-même (ce changement de configuration ne redémarrez pas votre activité, même lors de l'exécution Android 3.2 ou supérieur de l'appareil).

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

TL;DR: ajouter "|screenSize" android:configChanges="orientation" pour l'API 14+

62voto

shanet Points 3026

C'est une sorte de compilation des réponses à partir de cette question: onConfigurationChanged pas appelé

S'assurer que vous ne faites pas appel setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); n'importe où. Ce sera la cause de onConfigurationChange() pour ne pas le feu.

Vérifiez que vous n'êtes pas à l'aide de android:screenOrientation dans votre manifeste.

Aussi, il ne devrait pas faire une différence, mais vous pouvez essayer d'utiliser android:configChanges="orientation|keyboardHidden|screenSize" plutôt que d' android:configChanges="orientation"

Si rien de tout cela fonctionne, lire par le biais de l'Android doc sur la manipulation de l'exécution des changements et assurez-vous que vous faites tout correctement. Il peut y avoir quelque chose quelque part d'autre dans votre code qui est à l'origine du problème. http://developer.android.com/guide/topics/resources/runtime-changes.html

EDIT: Comme derrik ont signalé, je suppose que vous avez été la modification de la configuration avec l'accéléromètre de la détection de la façon dont le dispositif a été confronté. Si vous souhaitez que la configuration pour changer le clavier est affiché/caché le configChanges dans le manifeste doit inclure keyboardHidden ainsi.

10voto

sonida Points 1578

Essayez d'utiliser celui-ci .....

 android:configChanges="orientation|keyboardHidden|screenSize"
 

5voto

derrik Points 102

Vous devez modifier l'entrée configChanges dans AndroidManifest.xml en:

 android:configChanges="keyboardHidden|orientation"
 

Sinon, le fait de faire glisser le clavier ne déclenche pas onConfigurationChange (), même si l'orientation change. Je viens de tester cela sur mon HTC Desire Z.

4voto

Munir Basheer Points 97

Ajoutez ceci à votre manifeste pour chaque activité.

 android:configChanges="keyboardHidden|orientation|screenSize"
 

Ensuite, remplacez onConfigurationChanged sur votre activité en tant que telle

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X