Forcer une activité Android à toujours utiliser le mode paysage

144

J'utilise la visionneuse Android VNC sur mon HTC G1 . Mais pour une raison quelconque, cette application est toujours en mode paysage alors que mon G1 est en mode portrait. Étant donné que la visionneuse Android VNC est open source, j'aimerais savoir comment est-il possible de coder en dur une activité pour qu'elle soit «paysage». Je voudrais le changer pour respecter l'orientation du téléphone.

hap497
la source

Réponses:

188

En regardant le AndroidManifest.xml ( lien ), à la ligne 9:

<activity android:screenOrientation="landscape" android:configChanges="orientation|keyboardHidden" android:name="VncCanvasActivity">

Cette ligne spécifie le screenOrientationcomme paysage, mais l'auteur va plus loin en remplaçant les changements d'orientation de l'écran avec configChanges="orientation|keyboardHidden". Cela pointe vers une fonction remplacée dans VncCanvasActivity.java.

Si vous regardez VncCanvasActivity, à la ligne 109 se trouve la fonction remplacée:

@Override
public void onConfigurationChanged(Configuration newConfig) {
  // ignore orientation/keyboard change
  super.onConfigurationChanged(newConfig);
}

L'auteur a spécifiquement mis un commentaire pour ignorer tout changement de clavier ou d'orientation.


Si vous souhaitez modifier cela, vous pouvez revenir au fichier AndroidManifest.xml illustré ci-dessus et modifier la ligne en:

<activity android:screenOrientation="sensor" android:name="VncCanvasActivity">

Cela devrait changer le programme pour passer du portrait au paysage lorsque l'utilisateur fait pivoter l'appareil.

Cela peut fonctionner, mais peut gâcher l'apparence de l'interface graphique, selon la façon dont la mise en page a été créée. Vous devrez en rendre compte. En outre, selon la façon dont les activités sont codées, vous pouvez remarquer que lorsque l'orientation de l'écran est modifiée, les valeurs qui ont été remplies dans les zones de saisie disparaissent. Cela peut également devoir être traité.

Pulkit Sethi
la source
3
Pourquoi exactement cet configChangesattribut est-il nécessaire? Il semble fonctionner sur mon téléphone sans clavier sans lui ... Dans quelles situations l'orientation changera-t-elle en portrait si vous avez screenOrientation="landscape"omis le configChanges?
Timmmm
comment forcer une activité intégrée telle que l'image système sélectionner la bibliothèque en paysage uniquement ou en portrait uniquement?
Jacky
118

Vous pouvez également définir les mêmes données dans votre code java.

myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

D'autres valeurs sur ActivityInfo vous permettront de le remettre en mode portrait verrouillé ou piloté par capteur. Personnellement, j'aime le définir sur quelque chose dans le manifeste comme suggéré dans une autre réponse à cette question, puis le modifier plus tard en utilisant l'appel ci-dessus dans le SDK Android s'il y a un besoin.

haseman
la source
@Yegor Pas toujours. À partir de la documentation Android:If the activity is currently in the foreground or otherwise impacting the screen orientation, the screen will immediately be changed (possibly causing the activity to be restarted)
Chaitanya
40

Dans mon OnCreate(Bundle), je fais généralement ce qui suit:

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
anwarma
la source
2
la méthode manifeste dans les autres réponses ne semble pas fonctionner mais @anwarma vôtre l'a fait
Anup
31

Vous pouvez spécifier l'orientation d'une activité dans le manifeste. Regardez ici .

<activity android:allowTaskReparenting=["true" | "false"]
...
          android:screenOrientation=["unspecified" | "user" | "behind" |
                                     "landscape" | "portrait" |
                                     "sensor" | "nosensor"]
...
                                       "adjustResize", "adjustPan"] >  
Michael Krauklis
la source
24

Dans le manifeste:

<activity  android:name=".YourActivity"
android:screenOrientation="portrait"
android:configChanges="orientation|screenSize">

Dans votre activité:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.your_activity_layout);
avisper
la source
11

Voici le code que j'ai utilisé pour afficher toutes les activités en mode paysage:

<activity android:screenOrientation="landscape"
          android:configChanges="orientation|keyboardHidden"
          android:name="abcActivty"/>
Megha
la source
2
"orientation" Si votre application cible le niveau d'API 13 ou supérieur, vous devez également déclarer le "screenSize"
Mina Fawzy
7

Une solution rapide et simple est pour le fichier AndroidManifest.xml, ajoutez ce qui suit pour chaque activité que vous souhaitez forcer en mode paysage:

android:screenOrientation="landscape"
joshgoldeneagle
la source
5

Cela fonctionne pour Xamarin.Android. Dans OnCreate ()

RequestedOrientation = Android.Content.PM.ScreenOrientation.Landscape;
Entrez
la source
4

C'est tout!! Longue attente pour ce correctif.

J'ai un vieux problème Android concernant le double démarrage d'une activité qui nécessitait (par programmation) le mode paysage: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)

Maintenant, Android active le mode Paysage au démarrage.

AndrewDC
la source
3

Arslan, pourquoi voulez-vous forcer l'orientation de manière programmatique, bien qu'il existe déjà un moyen de manifester <activity android:name=".youractivityName" android:screenOrientation="portrait" />

Lune bleue
la source
Im pas le demandeur, mais peut-être qu'il veut forcer par programme parce qu'il veut le forcer à un certain moment?
Hamzah Malik
1

Le faire dans le code est une erreur IMO et encore plus si vous le mettez dans onCreate. Faites-le dans le manifeste et le "système" connaît l'orientation depuis le démarrage de l'application. Et ce type de méta ou de "guidage" de niveau supérieur DEVRAIT être dans le manifeste. Si vous voulez vous le prouver, définissez une pause dans onCreate de l'activité. Si vous le faites en code là, il sera appelé deux fois: il démarre en mode Portrait puis passe en Paysage. Cela ne se produit pas si vous le faites dans le manifeste.

RichieHH
la source
1
Je ne suis pas d'accord. Faire quoi que ce soit dans le code plutôt que via un manifeste est toujours ma méthode préférée. Sur la base du principe de responsabilité unique, le manifeste ne doit concerner que les propriétés au niveau de l'application, les autorisations et les liaisons d'API. En fait, je ne suis pas d'accord avec la balise <activity> présente dans un manifeste d'application et je ne l'ai donc jamais mise là-dedans (et cela fonctionne bien). La façon dont une activité est présentée est évidemment un problème de présentation. Votre activité doit être seule responsable de la façon dont elle est présentée, c'est pourquoi je mets généralement toute la logique de présentation dans le code vue / activité.
ComeIn
0

Pour Android 4.0 (Ice Cream Sandwich) et versions ultérieures, je devais les ajouter, en plus de la landscapevaleur.

android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"

Utiliser uniquement keyboardHidden|orientationentraînerait toujours des fuites de mémoire et une recréation de mes activités lorsque j'appuyais sur le bouton d'alimentation.

Peterdk
la source
Alerte de mauvaise pratique! Cela n'a rien à voir avec le fait de forcer l'activité en mode paysage. Vous devez toujours mettre en œuvre le stockage et la recréation de l'état de votre activité. Ce sont les connaissances de base du développement Android. Ne résolvez pas cela avec cette solution hacky. L'activité peut toujours être fermée par le système s'il a besoin de plus de mémoire.
Roel
@Roel, eh bien c'est le seul moyen d'empêcher l'activité de revenir en portrait lorsque, par exemple, vous faites pivoter l'appareil. Cela empêche que ces changements de configuration affectent l'activité.
Peterdk
Désolé pour le message un peu grincheux, mais je l'ai testé et je n'ai pas toutes ces valeurs pour le mode paysage. Lorsque vous ajoutez toutes ces valeurs, cela signifie que vous gérez vous-même les modifications dans onConfigurationChanged () au lieu que l'activité est juste redémarrée (et vous devez l'implémenter!) Mais si vous forcez Landschape, une rotation ne se produira pas.
Roel
Salut, certains d'entre eux ne sont peut-être pas nécessaires, mais les omettre tous entraînera des problèmes de rotation étranges. Je ne peux pas tester maintenant, mais lorsque je développais une application qui devait être en mode paysage tout le temps, seule l'utilisation orientation|screensizen'était pas suffisante dans tous les cas. Il reviendrait automatiquement au portrait.
Peterdk
Ces modifications de configuration sont également utilisées dans Google Mobile Ads et d'autres SDK publicitaires. C'est de là que je les ai obtenus à ce moment-là.
Peterdk
0

Utilisez ActivityInfo (android.content.pm.ActivityInfo) dans votre méthode onCreate avant d'appeler la méthode setLayout comme ceci

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Yamikani Sita
la source
0

utiliser uniquement
android: screenOrientation = "portrait" tools: ignore = "LockedOrientationActivity"

Vibhu Vikram Singh
la source
0

Ajouter les lignes suivantes dans l'activité

Vous devez entrer dans chaque activité

pour le paysage

android:screenOrientation="landscape"
tools:ignore="LockedOrientationActivity"

pour portrait

android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity"

Voici l'exemple de MainActivity

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="org.thcb.app">
    <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="landscape"
            tools:ignore="LockedOrientationActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".MainActivity2"
            android:screenOrientation="portrait"
            tools:ignore="LockedOrientationActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
Chetan
la source
-25

Appuyez CTRL+F11pour faire pivoter l'écran.

Yann Pascal DEUNGOUE DJOMENI
la source
3
Ils veulent maintenant savoir comment définir l'orientation par défaut d'une application, et non comment faire pivoter l'écran.
kyle k
CTRL + f12 pour l'émulateur.
Lazy