Comment désactiver le mode paysage dans Android?


933

Comment puis-je désactiver le mode paysage pour certaines des vues de mon application Android?


3
Essayez-vous essentiellement de désactiver la fonction de rotation automatique. Essayez de définir votre orientation préférée dans vos vues portrait? http://code.google.com/android/reference/android/R.styleable.html#AndroidManifestActivity_screenOrientation
adam

Réponses:


1633

Ajoutez android:screenOrientation="portrait"à l'activité dans AndroidManifest.xml. Par exemple:

<activity android:name=".SomeActivity"
    android:label="@string/app_name"
    android:screenOrientation="portrait" />

EDIT: Puisque c'est devenu une réponse super populaire, je me sens très coupable car forcer le portrait est rarement la bonne solution aux problèmes auxquels il est fréquemment appliqué.
Les principales mises en garde avec portrait forcé:

  • Cela ne vous dispense pas d'avoir à penser aux événements du cycle de vie des activités ou à l'état de sauvegarde / restauration correct. Outre la rotation des applications, de nombreuses choses peuvent déclencher une destruction / récréation d'activité, y compris des choses inévitables comme le multitâche. Il n'y a pas de raccourci; apprendre à utiliser des bundles et des retainInstancefragments.
  • Gardez à l'esprit que contrairement à l'expérience iPhone assez uniforme, il existe certains appareils où le portrait n'est pas l'orientation clairement populaire. Lorsque les utilisateurs sont sur des appareils avec des claviers matériels ou des manettes de jeu à la manière du Nvidia Shield, sur des Chromebooks , sur des appareils pliables ou sur Samsung DeX , le fait de forcer le portrait peut rendre l'expérience de votre application limitante ou gênante d'utilisation. Si votre application ne dispose pas d'un argument UX fort qui entraînerait une expérience négative pour la prise en charge d'autres orientations, vous ne devriez probablement pas forcer le paysage. Je parle de choses comme "c'est une application de caisse enregistreuse pour un modèle spécifique de tablette toujours utilisé dans un dock matériel fixe".

La plupart des applications doivent donc laisser les capteurs, le logiciel et la configuration physique du téléphone décider eux-mêmes de la manière dont l'utilisateur souhaite interagir avec votre application. Quelques cas auxquels vous voudrez peut-être penser, cependant, si vous n'êtes pas satisfait du comportement d' sensororientation par défaut dans votre cas d'utilisation:

  • Si votre principale préoccupation est une modification accidentelle de l'orientation en cours d'activité que vous pensez que les capteurs et le logiciel de l'appareil ne fonctionneront pas bien (par exemple, dans un jeu basé sur l'inclinaison), envisagez de prendre en charge le paysage et le portrait, mais d'utiliser nosensorpour l'orientation. Cela force le paysage sur la plupart des tablettes et le portrait sur la plupart des téléphones, mais je ne recommanderais toujours pas cela pour la plupart des applications "normales" (certains utilisateurs aiment simplement taper le clavier logiciel paysage sur leurs téléphones, et de nombreux utilisateurs de tablettes lisent en portrait - et vous devez les laisser).
  • Si vous devez toujours forcer le portrait pour une raison quelconque, cela sensorPortraitpeut être mieux que portraitpour Android 2.3+; cela permet un portrait à l'envers, ce qui est assez courant dans l'utilisation de la tablette.

54
Il est possible de le faire pour l'ensemble de l'application. Découvrez ceci stackoverflow.com/a/9784269/1300707
Liam George Betsworth

1
J'ai remarqué qu'il y a un autre portrait: sensorPortait. Quelle est la différence entre sensorPortait et portrait?
Jacky

1
Si vous lisez les documents de Google : "Orientation portrait, mais peut être un portrait normal ou inversé en fonction du capteur de l'appareil. Ajouté au niveau 9 de l'API." Donc - c'est-à-dire «portrait, côté droit vers le haut ou à l'envers, Android 2.3+ uniquement».
Yoni Samlan

2
Comme je l'ai noté dans ma réponse ci-dessous - pour contourner plusieurs problèmes, "nosensor" est probablement une meilleure option.
Mike Weir

1
Je dois dire que je ne suis pas d'accord. Toutes les expériences ne sont pas compatibles avec le mode paysage sur les téléphones, vous devez donc laisser l'UX décider, pas les capteurs. Ce n'est pas le cas sur les tablettes.
Renzo Tissoni

110

Je n'étais pas au courant du AndroidManifest.xmlchangement de fichier avant de lire ce post, donc dans mes applications, je l'ai utilisé à la place:

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);     //  Fixed Portrait orientation

9
cela peut faire sauter votre activité à la première charge si l'appareil n'est pas dans l'orientation spécifiée.
Dori

J'utilisais cette méthode, je l'appelais dans OnCreate puis je lisais les données de certains fichiers de ressources. Si je commençais l'application avec un appareil en orientation paysage, elle tournerait, mais cela entraînerait une lecture erronée de ces actifs d'initialisation, pour une raison étrange (j'aurais peut-être dû attendre que la rotation se termine). L'utilisation de l'alternative xml n'a pas causé ce problème.
Radu Simionescu

1
Cela peut être un problème avec la séquence de démarrage des programmes Android. Vous pouvez essayer de déplacer setRequestedOrientation () vers onResume () ???
Rich

45

Ajoutez ceci android:screenOrientation="portrait"dans votre fichier manifeste où vous déclarez votre activité comme ceci

<activity android:name=".yourActivity"
    ....
    android:screenOrientation="portrait" />

Si vous voulez faire en utilisant du code java, essayez

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

avant d'appeler la setContentViewméthode pour votre activité en onCreate().

J'espère que cette aide et facilement compréhensible pour tous ...


29

Beaucoup de réponses suggèrent ici d'utiliser "portrait"dans votre fichier AndroidManifest.xml. Cela peut sembler être une bonne solution - mais comme indiqué dans la documentation, vous distinguez les périphériques qui ne peuvent avoir qu'un paysage. Vous forcez également certains appareils (qui fonctionnent mieux en paysage) à passer en mode portrait, sans obtenir l'orientation appropriée.

Ma suggestion est d'utiliser à la "nosensor"place. Cela laissera l'appareil utiliser son orientation préférée par défaut, ne bloquera aucun achat / téléchargement sur Google Play et garantira que le capteur ne gâche pas votre jeu (NDK, dans mon cas).


Étant donné que beaucoup votent pour cela, je voudrais souligner que je suis depuis allé avec d'autres réponses suggérant "portrait" car certains appareils obscurs répondent en fait de manière imprévisible lorsqu'ils souhaitent implémenter la rotation d'écran dans l'application, qui est devenue un exigence plus tard pour moi. Je doute également que toutes les applications avec "portrait" soient bloquées par toute configuration de Google Play.
Mike Weir

Google Play filtre en fait les applications en mode portrait uniquement sur les appareils en mode paysage uniquement, consultez la note sur cette page: developer.android.com/guide/topics/manifest/… ("la valeur que vous déclarez permet le filtrage par des services tels que Google Jouer ")
miracle2k

14

Si vous souhaitez des paramètres utilisateur,

alors je recommanderais setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Vous pouvez modifier les paramètres à partir d'un menu de paramètres.

J'en ai besoin parce que mes minuteries doivent correspondre à ce qui est à l'écran, et tourner l'écran détruira l'activité en cours.


14

Ajoutez simplement Like this Line dans votre manifeste

android: screenOrientation = "portrait"

<manifest
    package="com.example.speedtest"
    android:versionCode="1"
    android:versionName="1.0" >

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >


        <activity
            android:name="ComparisionActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait" >
        </activity>

    </application>

</manifest>   

9

Vous pouvez le faire pour l'ensemble de votre application sans avoir à étendre toutes vos activités à une classe de base commune.

L'astuce consiste d'abord à vous assurer d'inclure une sous-classe d'application dans votre projet. Dans son onCreate (), appelé au premier démarrage de votre application, vous enregistrez un objet ActivityLifecycleCallbacks (API niveau 14+) pour recevoir des notifications d'événements de cycle de vie d'activité.

Cela vous donne la possibilité d'exécuter votre propre code chaque fois qu'une activité dans votre application est démarrée (ou arrêtée, ou reprise, ou autre). À ce stade, vous pouvez appeler setRequestedOrientation () sur l'activité nouvellement créée.

Et n'oubliez pas d'ajouter app: name = ". MyApp" dans votre fichier manifeste.

class MyApp extends Application {

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

        // register to be informed of activities starting up
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {

            @Override
            public void onActivityCreated(Activity activity, 
                                          Bundle savedInstanceState) {

                // new activity created; force its orientation to portrait
                activity.setRequestedOrientation(
                    ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }
            ....
        });
    }
}

7

Utilisez-le dans onCreate () de l'activité

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

7

Vous devez changer android:screenOrientation="sensorPortrait"dans AndroidManifest.xml


6

Ajoutez simplement cet attribut dans votre balise d'activité.

 android:screenOrientation="portrait"

6

Si vous ne voulez pas passer par les tracas de l'ajout d'orientation dans chaque entrée manifeste d'activité, créez une classe BaseActivity (hérite de 'Activity' ou 'AppCompatActivity') qui sera héritée par chaque activité de votre application au lieu de 'Activity 'ou' AppCompatActivity 'et ajoutez simplement le code suivant dans votre BaseActivity:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    // rest of your code......
}

5

Ajoutez android:screenOrientation="portrait"à l'activité que vous souhaitez désactiver le mode paysage.


5

Si vous souhaitez désactiver Landscape mode for your android app(ou une seule activité), il vous suffit d'ajouter,

android:screenOrientation="portrait"à la balise d'activité dans le AndroidManifest.xmlfichier.

Comme:

<activity android:name="YourActivityName" 
    android:icon="@drawable/ic_launcher" 
    android:label="Your App Name" 
    android:screenOrientation="portrait">

Une autre façon, l'approche programmatique.

Si vous voulez le faire par programme, c'est-à-dire. en utilisant du code Java. Vous pouvez le faire en ajoutant le code ci-dessous dans la classe Java de l'activité que vous ne souhaitez pas afficher en mode paysage.

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

J'espère que cela vous aide. Pour plus de détails, vous pouvez visiter ici entrer la description du lien ici


2
Étant donné que tant de réponses donnent des conseils qui contredisent les bons conseils de @Phoenix et @Yoni, je pense qu'un bon résultat est de réitérer ce qu'ils suggèrent:android:screenOrientation="nosensor">
DSlomer64

1
@ DSlomer64 Oui. Si vous voulez faire face aux tablettes, vous devez utiliser la valeur nosensor à la place portrait
IntelliJ Amiya

5

Comment changer l'orientation dans une partie de la vue

Au lieu de verrouiller l'orientation de toute l'activité, vous pouvez utiliser cette classe pour verrouiller dynamiquement l'orientation de n'importe laquelle de vos vues de manière pragmatique: -

Faites votre paysage

OrientationUtils.lockOrientationLandscape(mActivity);

Faites votre portrait

OrientationUtils.lockOrientationPortrait(mActivity);

Déverrouiller l' orientation

OrientationUtils.unlockOrientation(mActivity);

Classe d'utilisation d'orientation

import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.os.Build;
import android.view.Surface;
import android.view.WindowManager;

/*  * This class is used to lock orientation of android app in nay android devices 
 */

public class OrientationUtils {
    private OrientationUtils() {
    }

    /** Locks the device window in landscape mode. */
    public static void lockOrientationLandscape(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
    }

    /** Locks the device window in portrait mode. */
    public static void lockOrientationPortrait(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }

    /** Locks the device window in actual screen mode. */
    public static void lockOrientation(Activity activity) {
        final int orientation = activity.getResources().getConfiguration().orientation;
        final int rotation = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay()
                .getRotation();

        // Copied from Android docs, since we don't have these values in Froyo
        // 2.2
        int SCREEN_ORIENTATION_REVERSE_LANDSCAPE = 8;
        int SCREEN_ORIENTATION_REVERSE_PORTRAIT = 9;

        // Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO
        if (!(Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO)) {
            SCREEN_ORIENTATION_REVERSE_LANDSCAPE = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
            SCREEN_ORIENTATION_REVERSE_PORTRAIT = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
        }

        if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90) {
            if (orientation == Configuration.ORIENTATION_PORTRAIT) {
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            } else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            }
        } else if (rotation == Surface.ROTATION_180 || rotation == Surface.ROTATION_270) {
            if (orientation == Configuration.ORIENTATION_PORTRAIT) {
                activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_PORTRAIT);
            } else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
                activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
            }
        }
    }

    /** Unlocks the device window in user defined screen mode. */
    public static void unlockOrientation(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
    }

}

4

utilisation

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

4

Vous devez définir l'orientation de chaque activité.

<activity
                android:name="com.example.SplashScreen2"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>
            <activity
                android:name="com.example.Registration"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>
            <activity
                android:name="com.example.Verification"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>
            <activity
                android:name="com.example.WelcomeAlmostDone"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>
            <activity
                android:name="com.example.PasswordRegistration"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>

4

ajouter une classe à l'intérieur de la méthode oncreate ()

 setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

4

Si vous utilisez Xamarin C #, certaines de ces solutions ne fonctionneront pas. Voici la solution que j'ai trouvée pour fonctionner.

[Activity(MainLauncher = true, Icon = "@drawable/icon", ScreenOrientation = ScreenOrientation.Portrait)]

La classe ci-dessus fonctionne bien, comme les autres solutions, elle n'est pas non plus applicable à l'échelle mondiale et doit être placée dans chaque en-tête d'activité.


4

Vous pouvez forcer votre activité particulière à toujours rester en mode portrait en écrivant ceci dans votre manifest.xml

 <activity android:name=".MainActivity"
        android:screenOrientation="portrait"></activity>

Vous pouvez également forcer votre activité à rester en mode postrait en écrivant la ligne suivante dans la méthode onCreate () de votre activité

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_layout);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

}

3
<android . . . >
    . . .
    <manifest . . . >
        . . .
        <application>
            <activity android:name=".MyActivity" 
                android:screenOrientation="portrait" 
                android:configChanges="keyboardHidden|orientation">
            </activity>
        </application>
    </manifest>
</android>

3

Ajoutez ci-dessous félicitations pour votre projet,

installation de npm

npm i react-native-orientation-locker

puis vous utilisez une classe manifeste comme React_Native (votre dossier de projet) / android / app / src / main / AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

<application
  android:name=".MainApplication"
  android:label="@string/app_name"
  android:icon="@mipmap/ic_launcher"
  android:allowBackup="false"
  android:theme="@style/AppTheme">
  <activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:screenOrientation="landscape"
    android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
    android:windowSoftInputMode="adjustResize">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
  </activity>
  <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
</application>

Merci!


2

Dans le <apphome>/platform/androidrépertoire créé AndroidManifest.xml(en le copiant à partir du répertoire généré). Ajoutez ensuite android:screenOrientation=" portrait" à TOUS les éléments d'activité.


2
 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="in.co.nurture.bajajfinserv">
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>


    <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:screenOrientation="portrait">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

nous pouvons restreindre l'activité en mode portrait ou paysage en utilisant l'attribut ou android: screenOrientation.

si nous avons plus d'une activité dans mon programme, vous avez la liberté de restreindre n'importe quelle activité dans n'importe quel mode et cela n'affecte jamais les autres dont vous ne voulez pas.


2

Soit en classe manifeste.

<activity android:name=".yourActivity"
    ....
    android:screenOrientation="portrait" />

ou par programme

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

Remarque: vous devez appeler cette setContentViewméthode avant pour votre activité dans onCreate().


2

Ajouter android:screenOrientation="portrait"dans AndroidManifest.xml fichier.

Par exemple :

<activity android:name=".MapScreen" 
 android:screenOrientation="portrait"></activity>

1

Dans l'espoir d'aider quelqu'un d'autre, l'attribut suivant sur l'activité dans AndroidManifest.xml est tout ce dont vous avez besoin:

android: configChanges = "orientation"

Donc, nœud d'activité complet:

<activity android:name="Activity1" 
    android:icon="@drawable/icon" 
    android:label="App Name" 
    android:configChanges="orientation">

Il reste tellement de réponses, vous devez fournir plus d'informations, pourquoi utiliser la vôtre. En particulier, les documents disent de ne pas utiliser cette option: "Remarque: L'utilisation de cet attribut doit être évitée et utilisée uniquement en dernier recours. Veuillez lire la rubrique Gestion des modifications de l'exécution pour plus d'informations sur la façon de gérer correctement un redémarrage en raison d'un changement de configuration." developer.android.com/guide/topics/manifest/…
Murmel

1

Dans kotlin, la même chose peut être programmée en utilisant ci-dessous

requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT

1

Cela a fonctionné pour moi, essayez d'ajouter ce code dans le fichier AndroidManifest

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme">
        ....
        ....
        </application>

J'aurais été une excellente solution, car vous n'avez pas à définir par activité. Malheureusement, ne fonctionne pas dans mon application.
Myroslav Kolodii

1

Mettez-le dans votre manifeste.

<activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:screenOrientation="sensorPortrait" />

L'orientation sera portrait, mais si le téléphone de l'utilisateur est à l'envers, il indique également la bonne façon. (Votre écran pivotera donc de 180 degrés).


Le système ignore cet attribut si l'activité s'exécute en mode multi-fenêtres .


0

si votre activité est liée au premier état d'orientation de l'appareil, récupérez l'orientation actuelle de l'appareil dans la onCreateméthode, puis corrigez-la pour toujours:

        int deviceRotation = ((WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getOrientation();

        if(deviceRotation == Surface.ROTATION_0) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
        else if(deviceRotation == Surface.ROTATION_180)
        {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
        }
        else if(deviceRotation == Surface.ROTATION_90)
        {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
        else if(deviceRotation == Surface.ROTATION_270)
        {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
        }
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.