Au cas où cela serait utile à certains développeurs plus récents car ce n'est pas spécifié ci-dessus. Juste pour être très explicite:
Vous avez besoin de deux choses si vous utilisez onConfigurationChanged :
Une onConfigurationChangedméthode dans votre classe d'activité
Spécifiez dans votre manifeste les modifications de configuration qui seront gérées par votre onConfigurationChangedméthode
L'extrait de code manifeste dans les réponses ci-dessus, bien qu'il soit sans aucun doute correct pour l'application particulière à laquelle appartient le manifeste, n'est PAS exactement ce que vous devez ajouter dans votre manifeste pour déclencher la méthode onConfigurationChanged dans votre classe d'activité. c'est-à-dire que l'entrée de manifeste ci-dessous peut ne pas être correcte pour votre application.
<activity name= ".MainActivity" android:configChanges="orientation|screenSize"/>
Dans l'entrée de manifeste ci-dessus, il existe diverses actions Android pour android:configChanges=""lesquelles peuvent déclencher onCreate dans le cycle de vie de votre activité.
Ceci est très important - Ceux qui ne sont PAS spécifiés dans le manifeste sont ceux qui déclenchent votre onCreate et ceux qui sont spécifiés dans le manifeste sont ceux qui déclenchent votre onConfigurationChangedméthode dans votre classe d'activité.
Vous devez donc identifier les modifications de configuration que vous devez gérer vous-même. Pour l'encyclopédie Android contestée comme moi, j'ai utilisé la fenêtre contextuelle des conseils rapides dans Android Studio et ajouté presque toutes les options de configuration possibles. La liste de tous ces éléments disait que je gérerais tout et onCreate ne sera jamais appelé en raison de configurations.
<activity name= ".MainActivity" android:configChanges="screenLayout|touchscreen|mnc|mcc|density|uiMode|fontScale|orientation|keyboard|layoutDirection|locale|navigation|smallestScreenSize|keyboardHidden|colorMode|screenSize"/>
Maintenant, évidemment, je ne veux pas tout gérer, alors j'ai commencé à éliminer les options ci-dessus une par une. Reconstruire et tester mon application après chaque suppression.
Un autre point important : s'il n'y a qu'une seule option de configuration gérée automatiquement qui déclenche votre onCreate (vous ne l'avez pas répertoriée dans votre manifeste ci-dessus), alors il semblera que cela onConfigurationChangedne fonctionne pas. Vous devez mettre tous les éléments pertinents dans votre manifeste.
J'ai fini avec 3 qui déclenchaient onCreate à l'origine, puis j'ai testé sur un S10 + et je recevais toujours le onCreate, donc j'ai dû refaire mon exercice d'élimination et j'avais également besoin du |screenSize. Alors testez sur une sélection de plateformes.
<activity name= ".MainActivity" android:configChanges="screenLayout|uiMode|orientation|screenSize"/>
Donc ma suggestion, même si je suis sûr que quelqu'un peut faire des trous dans ceci:
Ajoutez votre onConfigurationChangedméthode dans votre classe d'activité avec un TOAST ou un journal afin que vous puissiez voir quand cela fonctionne.
Ajoutez toutes les options de configuration possibles à votre manifeste.
Confirmez que votre onConfigurationChangedméthode fonctionne en testant votre application.
Supprimez chaque option de configuration de votre fichier manifeste une par une, en testant votre application après chacune.
Testez sur une aussi grande variété d'appareils que possible.
Ne copiez / collez pas mon extrait ci-dessus dans votre fichier manifeste. Les mises à jour Android modifient la liste, utilisez donc les astuces Android Studio pour vous assurer de toutes les avoir.
J'espère que cela fera gagner du temps à quelqu'un.
Ma onConfigurationChangedméthode juste pour info ci-dessous. onConfigurationChangedest appelée dans le cycle de vie une fois que la nouvelle orientation est disponible, mais avant que l'interface utilisateur n'ait été recréée. Par conséquent, ma première ifvérification de l'orientation fonctionne correctement, puis la deuxième imbriquée ifpour regarder la visibilité de mon UI ImageView fonctionne également correctement.
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
pokerCardLarge = findViewById(R.id.pokerCardLgImageView);
if(pokerCardLarge.getVisibility() == pokerCardLarge.VISIBLE){
Bitmap image = ((BitmapDrawable)pokerCardLarge.getDrawable()).getBitmap();
pokerCardLarge.setVisibility(pokerCardLarge.VISIBLE);
pokerCardLarge.setImageBitmap(image);
}
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
pokerCardLarge = findViewById(R.id.pokerCardLgImageView);
if(pokerCardLarge.getVisibility() == pokerCardLarge.VISIBLE){
Bitmap image = ((BitmapDrawable)pokerCardLarge.getDrawable()).getBitmap();
pokerCardLarge.setVisibility(pokerCardLarge.VISIBLE);
pokerCardLarge.setImageBitmap(image);
}
}
}