84 votes

Android, comment ne pas détruire l'activité lorsque je fais pivoter l'appareil ?

J'ai une application qui ne fonctionne qu'en mode portrait, et j'ai fait les changements dans mon fichier manifeste pour que l'orientation de chaque activité soit le portrait. Mais lorsque je fais pivoter l'appareil, l'activité se recrée à nouveau. Comment faire pour ne pas détruire l'activité ?

1 votes

Ceci est souvent déconseillé, vous pouvez essayer de définir l'orientation de vos applications de manière programmatique avec quelque chose comme : setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) ;

7 votes

Pourquoi serait-ce contre ? Disons que nous avons un service qui prend 2 secondes pour s'exécuter. Si l'activité est détruite à chaque fois, ce service continue de s'exécuter à chaque fois alors que je n'ai besoin qu'une seule fois de l'exécuter.

134voto

Pour API 12 et moins : add

android:configChanges="orientation"

Ajoutez "screenSize" si vous visez la cible. API 13 ou plus parce que chaque fois que votre orientation change, la taille de votre écran aussi, sinon les nouveaux appareils continueront à détruire votre activité. Voir la réponse d'Egg ci-dessous pour plus d'informations sur l'utilisation de "screenSize".

android:configChanges="orientation|screenSize"

à votre activité dans AndroidManifest.xml. De cette façon, votre activité ne sera pas redémarrée automatiquement. Voir la documentation pour plus d'informations

108voto

egg Points 871

D'après le document officiel, Flurin a dit,

Remarque : si votre application vise le niveau 13 de l'API ou un niveau supérieur (comme déclaré déclarée par les attributs minSdkVersion et targetSdkVersion), vous devez également déclarer également la configuration "screenSize", car elle change également lorsqu'un périphérique passe de l'orientation portrait à l'orientation paysage.

Donc, si votre application vise le niveau 13 de l'API ou plus, vous devez définir cette configuration à la place :

android:configChanges="orientation|screenSize"

4 votes

Merci beaucoup ! Toutes les autres réponses manquent cette partie où le niveau 13 de l'API introduit ce truc screenSize. Vous venez de me sauver la vie ! :)

1 votes

@egg Merciuuuuuuu ! :) Cela a aidé !

1 votes

Bon conseil, c'est difficile de suivre la documentation quand on le fait à temps partiel.

9voto

er_benji Points 55

La bonne solution est

android:configChanges="orientation|screenSize"

Documentation Android :

La taille actuelle de l'écran disponible a changé. Cela représente un changement de la taille actuellement disponible, par rapport au rapport d'aspect actuel, et changera donc lorsque l'utilisateur passera du mode paysage au mode portrait. Toutefois, si votre application vise le niveau 12 de l'API ou un niveau inférieur, votre activité gère toujours ce changement de configuration elle-même (ce changement de configuration ne redémarre pas votre activité, même lorsqu'elle fonctionne sur un appareil Android 3.2 ou supérieur).*

5voto

superheron Points 93

J'ai fait un peu n'importe quoi et je me suis rendu compte que dans le fichier Manifest, je plaçais les configChanges au niveau de l'application et non de l'activité. Voici à quoi ressemble le code lorsqu'il fonctionne correctement pour moi.

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
                  android:configChanges="orientation|screenSize|keyboardHidden">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity> 
</application>

1voto

pkoepke Points 141

Maintenant qu'Android prend en charge l'écran partagé ("multifenêtre" dans le jargon Android), vous voudrez probablement ajouter screenSize|smallestScreenSize|screenLayout|orientation également. Ainsi, pour gérer la rotation et l'écran partagé, vous aurez besoin de quelque chose comme ceci dans Android:configChanges

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
                  android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity> 
</application>

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