web-dev-qa-db-fra.com

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 toujours lorsque l'orientation change, onCreate() est appelé. 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.

39
Stefan Bossbaly

Quelques choses à essayer:

Android:configChanges="orientation|keyboardHidden|screenSize" plutôt que Android:configChanges="orientation"

Assurez-vous que vous n'appelez pas setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); nulle part. OnConfigurationChange () ne se déclenchera pas.

Vérifiez que vous n'utilisez pas Android:screenOrientation dans votre manifeste.

Si rien de tout cela ne fonctionne, lisez le document Android sur la gestion des modifications d'exécution et assurez-vous de tout faire correctement. Il peut y avoir quelque chose quelque part ailleurs dans votre code qui cause le problème. http://developer.Android.com/guide/topics/resources/runtime-changes.html

EDIT: Comme Derrik l’a fait remarquer, j’ai supposé que vous changiez la configuration avec l’accéléromètre pour détecter la position du périphérique. Si vous souhaitez que la configuration change lorsque le clavier est affiché/masqué, les modifications de config dans le manifeste doivent également inclure keyboardHidden.

55
shanet

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

Attention: à partir de Android 3.2 (API niveau 13), la "taille de l'écran" change également lorsque l'appareil bascule entre portrait et paysage orientation. Ainsi, si vous souhaitez empêcher les redémarrages d’exécution dus à changement d'orientation lors du développement pour l'API de niveau 13 ou supérieur (comme déclaré par les attributs minSdkVersion et targetSdkVersion), vous doit inclure la valeur "screenSize" en plus de "l'orientation" valeur. Autrement dit, vous devez decalare Android: configChanges = "orientation | screenSize". Cependant, si votre API d'application de niveau 12 ou moins, votre activité est toujours gère cette modification de configuration elle-même (cette modification de configuration ne redémarre pas votre activité, même si elle est exécutée sur un appareil Android 3.2 ou supérieur).

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

TL; DR: ajouter "| screenSize" à Android: configChanges = "orientation" pour API 14+

78
nmr

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

Android:configChanges="orientation|keyboardHidden|screenSize"
10
sonida

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.

5
derrik

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);
}
4
Munir Basheer

Cela ne se déclenchait pas dans ma Fragment (Fragments ne sont pas enregistrés dans le AndroidManifest.xml). J'ai donc dû le déplacer dans la Activity qui gère ma Fragment, dans mon cas la TabsPagerActivity.

1
craned

Manifeste:

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

Activité et fragment:

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

Sortie:

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

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

Peu de choses peuvent être vérifiées:

Dans mon cas, je suivais le changement de langue du périphérique à l'aide de onConfigurationChanged.

Peu de choses à savoir sur onConfigurationChanged sont les différences de comportement entre onConfigurationChanged d'activité et d'application. 

Lorsque vous modifiez la configuration du périphérique, le niveau d'application onConfigurationChanged sera appelé automatiquement et immédiatement, mais onConfigurationChanged d'activité sera appelé lorsque vous accéderez à cette activité.  

et une autre chose est que seule la locale dans manifest ne fonctionnera pas parfois. Vous devez donc déclarer un autre événement de modification de configuration avec la locale (dans mon cas) qui devrait être comme Android: configChanges = "layoutDirection | locale"  

0
anoopbryan2