Forcer le mode d'orientation «portrait»

298

J'essaie de forcer le mode "portrait" pour mon application car mon application n'est absolument pas conçue pour le mode "paysage".

Après avoir lu certains forums, j'ai ajouté ces lignes dans mon fichier manifeste:

<application 
  android:debuggable="true"
  android:icon="@drawable/icon" 
  android:label="@string/app_name"
  android:screenOrientation="portrait">

Mais cela ne fonctionne pas sur mon appareil (HTC Desire). Il passe de "portrait" à "paysage", ignorant les lignes du fichier manifeste.

Après avoir lu plus de forums, j'ai essayé d'ajouter ceci dans mon fichier manifeste:

<application 
  android:debuggable="true"
  android:icon="@drawable/icon" 
  android:label="@string/app_name"
  android:configChanges="orientation"       
  android:screenOrientation="portrait">

et cette fonction dans ma classe d'activité:

public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

Mais encore une fois, pas de chance.

thomaus
la source

Réponses:

531

N'appliquez pas l'orientation à l' élément d' application , vous devez plutôt appliquer l'attribut à l' élément d' activité , et vous devez également définir configChangescomme indiqué ci-dessous.

Exemple:

<activity
   android:screenOrientation="portrait"
   android:configChanges="orientation|keyboardHidden">
</activity>

Ceci est appliqué dans le fichier manifeste AndroidManifest.xml.

C0deAttack
la source
26
À quoi sert configChanges?
Dror
71
@Orchestrator, configChanges signifie que le changement de configuration est géré par l'activité elle-même. Sans cela, l'activité sera redémarrée en cas de changement d'orientation. Vous pourriez vous demander, si vous avez spécifié que l'orientation est "portrait", comment cela pourrait-il changer? Cela peut changer si vous lancez une autre activité qui modifie l'orientation, puis que la nouvelle activité se termine, vous ramenant à votre activité. Par exemple, l'intention de capture d'image par défaut sur le Samsung Galaxy S3 le fait dans certaines orientations.
Gordon McCreight
2
@GordonMcCreight, pouvez-vous s'il vous plaît expliquer cela avec un exemple réel "Vous pourriez demander, si vous avez spécifié que l'orientation est" portrait "comment cela changerait-il jamais? Il peut changer si vous lancez une autre activité qui modifie l'orientation, alors que une nouvelle activité se termine et vous ramène à votre activité. "
Tushar Pandey
3
Bien sûr, @TusharPandey. Si je me souviens bien, le seul endroit où cela nous a causé du chagrin était lorsque notre activité a lancé l'intention de capture d'image par défaut sur le Samsung Galaxy S3. Fondamentalement, nous voulions juste prendre une photo et obtenir les résultats. Cependant, lorsque l'intention de la caméra est revenue, cela a provoqué un changement d'orientation qui a anéanti l'état de notre activité, car nous ne pensions pas que nous devions nous protéger contre cela (étant donné que notre application entière n'était que dans l'orientation "portrait"). Comment et pourquoi le Galaxy S3 fait cela dépasse ma compréhension (certes limitée).
Gordon McCreight
8
Pourquoi "keyboardHidden" est-il inclus?
gonzobrains
24

Notez que

android:screenOrientation="portrait"     
android:configChanges="orientation|keyboardHidden"

est ajouté dans le fichier manifeste - où l'activité est définie.

Pointeur nul
la source
13

Je pense que android:screenOrientation="portrait"peut être utilisé pour des activités individuelles. Utilisez donc cet attribut dans une <activity>balise comme:

<activity android:name=".<Activity Name>"
    android:label="@string/app_name" 
    android:screenOrientation="portrait">
   ...         
</activity>
Pinki
la source
13

Si vous avez beaucoup d'activités comme la mienne, dans votre application Ou si vous ne voulez pas entrer le code de chaque balise d'activité dans le manifeste, vous pouvez le faire.

dans votre classe Application Base, vous obtiendrez un rappel de cycle de vie

Donc, fondamentalement, ce qui se passe pour chaque activité lors de la création de la création sur la classe d'application déclenchée ici est le code ..

public class MyApplication extends Application{

@Override
    public void onCreate() {
        super.onCreate();  

  registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle bundle) {
                activity.setRequestedOrientation(
                        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


// for each activity this function is called and so it is set to portrait mode


            }

            @Override
            public void onActivityStarted(Activity activity) {

            }

            @Override
            public void onActivityResumed(Activity activity) {

            }

            @Override
            public void onActivityPaused(Activity activity) {

            }

            @Override
            public void onActivityStopped(Activity activity) {

            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {

            }

            @Override
            public void onActivityDestroyed(Activity activity) {

            }
        });
}

J'espère que ça aide.

Muneef M
la source
1
Réponse efficace! cela devrait être la bonne réponse, en particulier pour ceux qui développent des applications complexes qui dépendent fortement d'un grand nombre d'activités.
FEBRYAN ASA PERDANA
10

Réglez le mode Portrait ou Paysage , ajoutez respectivement des lignes.

Importer sous la ligne:

import android.content.pm.ActivityInfo;

Ajouter la ligne ci-dessous juste au-dessus setContentView(R.layout.activity_main);

Pour le portrait :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//Set Portrait

Pour l' aménagement paysager :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//Set Landscape

Cela fonctionnera certainement.

Parth Patel
la source
1
Cela échoue avec Android 9 sur certains appareils - la transition de rotation de l'écran est visible pendant un bref instant même si vous n'utilisez que PORTRAIT
Igor Wojda
Pouvez-vous s'il vous plaît spécifier les informations sur l'appareil dans lesquelles vous avez face à cela, si possible
Parth Patel
4

Selon la documentation d'Android, vous devez également inclure souvent screenSizeun éventuel changement de configuration.

android:configChanges="orientation|screenSize"

Si votre application cible l'API de niveau 13 ou supérieur (comme déclaré par les attributs minSdkVersion et targetSdkVersion), vous devez également déclarer la configuration "screenSize", car elle change également lorsqu'un appareil bascule entre les orientations portrait et paysage.

En outre, si vous tous d' inclure la valeur keyboardHiddendans vos exemples, vous ne devriez pas alors considérer aussi locale, mcc, fontScale, keyboardet d' autres? ..

Martynas
la source
3

J'avais cette ligne dans mon AndroidManifest.xml

<activity 
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
    android:label="@string/app_name" android:name="Project Name"
    android:theme="@android:style/Theme.Black.NoTitleBar">

Ce que j'ai changé en (juste ajouté android:screenOrientation="portrait")

<activity 
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
    android:label="@string/app_name" android:name="Project Name"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Black.NoTitleBar">

Cela a arrangé les choses pour moi.

Ian Jamieson
la source
2

Quelque chose à compléter: j'ai récemment mis à jour une application, la précédente fonctionnait en mode paysage et portrait, et je veux que la version mise à jour fonctionne en mode portrait, j'ai donc ajouté

android:screenOrientation="portrait"

à l'activité correspondante, et il s'est juste écrasé lorsque j'ai testé la mise à jour. J'ai ensuite ajouté

android:configChanges="orientation|keyboardHidden"

aussi, et ça marche.

user2819453
la source
1
Si ce n'est pas une réponse à la question, peut-être l'ajouter comme commentaire aiderait.
JPReddy
Vérifiez que vous l'avez ajouté à l'activité non pour le bloc d'application
Waran-
1

Je pense que vous souhaitez ajouter android:configChanges="orientation|keyboardHidden"à votre activité? Sinon, l'activité est redémarrée lors du changement de configuration. Le onConfigurationChangedne serait pas appelé alors, seul leonCreate

Nanne
la source
1

Si vous souhaitez prendre en charge différentes orientations debuget releaseversions, écrivez-le (voir https://developer.android.com/studio/build/gradle-tips#share-properties-with-the-manifest ).

Dans build.gradlevotre appdossier, écrivez:

android {
    ...
    buildTypes {
        debug {
            applicationIdSuffix '.debug'
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // Creates a placeholder property to use in the manifest.
            manifestPlaceholders = [orientation: "fullSensor"]
        }
        release {
            debuggable true
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // Creates a placeholder property to use in the manifest.
            manifestPlaceholders = [orientation: "portrait"]
        }
    }
}

Ensuite, AndroidManifestvous pouvez utiliser cette variable "orientation" dans n'importe quel Activity:

<activity
    android:name=".LoginActivity"
    android:screenOrientation="${orientation}" />

Vous pouvez ajouter android:configChanges:

manifestPlaceholders = [configChanges: "", orientation: "fullSensor"]en débogage et manifestPlaceholders = [configChanges: "keyboardHidden|orientation|screenSize", orientation: "portrait"]en version,

<activity
    android:name=".LoginActivity"
    android:configChanges="${configChanges}"
    android:screenOrientation="${orientation}" />
CoolMind
la source
-8

Réponse courte: ne le faites pas.

Reconcevoir votre application afin qu'elle puisse fonctionner en mode portrait et paysage. Il n'y a rien de tel qu'une interface utilisateur qui ne peut pas être conçue pour fonctionner à la fois en mode portrait et paysage; seuls les développeurs paresseux ou sans imagination.

La raison en est assez simple. Vous souhaitez que votre application soit utilisable par un public aussi large que possible sur autant d'appareils différents que possible. En forçant une orientation d'écran particulière, vous empêchez votre application de s'exécuter (de manière utilisable) sur des appareils qui ne prennent pas en charge cette orientation et vous frustrez et aliénez les clients potentiels qui préfèrent une orientation différente.

Exemple: vous concevez votre application pour forcer le mode portrait. Un client télécharge l'application sur un appareil 2 en 1 qu'il utilise principalement en mode paysage.
Conséquence 1: votre application est inutilisable ou votre client est obligé de déconnecter son appareil, de le faire pivoter et de l'utiliser dans une orientation qui ne lui est pas familière ou confortable.
Conséquence 2: le client est frustré par la conception non intuitive de votre application et trouve une alternative ou abandonne complètement l'application.

Je me bats avec ça avec une application en ce moment et en tant que consommateur et développeur, je déteste ça. Aussi utile que soit l'application, aussi fantastique que les fonctionnalités qu'elle offre, je déteste absolument l'application car elle me force à utiliser une orientation qui est contraire à toutes les autres façons dont j'utilise mon appareil.

Vous ne voulez pas que vos clients détestent votre application.


Je sais que cela ne répond pas directement à la question, donc je veux l'expliquer un peu plus en détail pour ceux qui sont curieux.

Les développeurs ont tendance à être vraiment bons en écriture de code et vraiment mauvais en conception. Cette question, même si elle ressemble à une question de code et que le demandeur a certainement l'impression que c'est une question de code, est vraiment une question de conception.

La question est vraiment "Dois-je verrouiller l'orientation de l'écran dans mon application?" Le demandeur a choisi de concevoir l'interface utilisateur pour qu'elle fonctionne et ne soit belle qu'en mode portrait. Je soupçonne que c'était pour gagner du temps de développement ou parce que le flux de travail de l'application est particulièrement propice à une mise en page portrait (commun pour les jeux mobiles). Mais ces raisons négligent tous les véritables facteurs importants qui motivent une conception appropriée.

  1. Engagement du client - vous voulez que vos clients se sentent attirés dans votre application, pas forcés d'en sortir. L'application doit passer en douceur de ce que faisait votre client avant d'ouvrir votre application. (C'est la raison pour laquelle la plupart des plates-formes ont des principes de conception cohérents, de sorte que la plupart des applications se ressemblent plus ou moins bien qu'elles ne le soient pas.)

  2. Réponse du client - vous voulez que vos clients réagissent positivement à votre application. Ils devraient aimer l'utiliser. Même si c'est une application de paie pour le travail, cela devrait être un plaisir pour eux de l'ouvrir et de pointer. L'application devrait faire gagner du temps à vos clients et réduire la frustration face aux alternatives. (Les applications qui ennuient les utilisateurs créent du ressentiment contre votre application, ce qui se transforme en ressentiment envers votre marque.)

  3. Conversion client - vous voulez que vos clients puissent passer rapidement et facilement de la navigation à l'interaction. C'est l'objectif ultime de toute application: convertir les impressions en revenus. (Les applications qui ne génèrent pas de revenus sont une perte de temps à créer, d'un point de vue commercial.)

Une interface utilisateur mal conçue réduit l'engagement et la réponse des clients, ce qui se traduit finalement par une baisse des revenus. Dans un monde axé sur le mobile (et en particulier sur le sujet des modes d'affichage portrait / paysage), cela explique pourquoi la conception Web réactive est si importante. Walmart Canada a introduit la conception adaptative sur son site Web en novembre 2013 et a enregistré une augmentation de 20% de la conversion des clients. O'Neill Clothing a mis en œuvre une conception Web réactive et les revenus des clients utilisant des appareils iOS ont augmenté de 101,25% et 591,42% des clients utilisant des appareils Android .

Les développeurs ont également tendance à se concentrer attentivement sur la mise en œuvre d'une solution particulière (telle que le verrouillage de l'orientation de l'affichage), et la plupart des développeurs de ce site seront très heureux d'aider à la mise en œuvre de cette solution, sans se demander si c'est la meilleure solution. solution au problème.

Verrouiller l'orientation de votre écran est l'équivalent de la conception de l'interface utilisateur de la mise en œuvre d'une boucle do-while. Êtes-vous vraiment sûr de vouloir procéder de cette façon ou existe-t-il une meilleure alternative?

Ne forcez pas votre application dans un seul mode d'affichage. Investissez du temps et des efforts supplémentaires pour le rendre réactif.

Thomas
la source
2
Je comprends et suis d'accord avec vous sur le fait qu'il s'agit d'une interface utilisateur mal conçue. Mais cela ne change pas le fait que vous POURRIEZ AVOIR BESOIN de le faire, et néanmoins le cadre devrait avoir ces capacités, en général. Vous ne savez jamais à quoi ressembleront et devront faire les futures applications, la question est donc toujours d'actualité.
Z. Khullah
1
Tu n'as pas tort. Je pense que ma réponse a été en partie alimentée par la frustration que j'ai avec quelques applications qui le font inutilement et cela ruine complètement l'expérience. Je dirai que le nombre de cas légitimes pour verrouiller le mode d'affichage est infiniment petit (et toujours faisable et préférable, mais pas dans les limites du budget). Cela évoque d'autres problèmes; le codage devenant aussi simple qu'il y a, il y a beaucoup de développeurs amateurs qui écrivent des applications parce qu'ils connaissent le code mais sans apprendre à faire l'interface utilisateur ou la conception, ni même les meilleures pratiques de base (applications Java qui s'installent dans \ AppData - EWWWW).
Thomas
1
Je crée une application VR. L'orientation DOIT ÊTRE paysage pour que les verres fassent leur magie. C'est un exemple d'une interface utilisateur qui ne peut pas être conçue pour fonctionner à la fois en mode portrait et paysage. Les jeux peuvent également devoir forcer une certaine orientation. Je parie qu'il y a des tonnes de cas légitimes.
Raslanove
1
Bien que StackExchange existe pour répondre à des questions spécifiques, les réponses doivent être écrites pour s'appliquer le plus généralement possible afin que ces réponses soient utiles aux autres. Le développement est bien plus que la simple écriture de code et la raison pour laquelle il y a tant d'applications indésirables dans le monde est que tant de développeurs oublient - ou n'apprennent jamais - ce principe important. J'ajouterais personnellement que si vous faites de la réalité virtuelle sur un téléphone, vous faites mal la réalité virtuelle - mais le coût a poussé la demande de réalité virtuelle sur des plateformes qui ne devraient jamais le prendre en charge.
Thomas
1
Je ne suis pas en désaccord avec cette réponse, mais elle répond à une question qui n'a pas été posée.
bmovement