Comment désactiver le changement d'orientation sur Android?

j'ai une application que je voudrais juste utiliser en mode portrait, donc j'ai défini android: screenOrientation= "portrait" dans le manifeste XML. Cela fonctionne bien pour le HTC Magic téléphone (et empêche les changements d'orientation sur les autres téléphones ainsi).

mais j'ai un problème avec le HTC G1 téléphone que j'ouvre le matériel Clavier QWERTY (pas le clavier virtuel). Mon activité reste dans mode portrait, mais il semble avoir redémarré et perd tous ses états. Cela ne se produit pas avec la version HTC Hero .

mon application est assez grande, donc je ne veux pas qu'elle redémarre et perde tous ses états lorsque le clavier est ouvert. Comment puis-je éviter cela?

269
demandé sur Peter Mortensen 2009-10-03 02:12:44

12 réponses

mise à Jour avril 2013: à ne pas faire. Ce n'était pas une bonne idée en 2009 lorsque j'ai répondu pour la première fois à la question et ce n'est vraiment pas une bonne idée maintenant. Voir la réponse de hackbod pour les raisons suivantes:

éviter de recharger l'activité avec asynctask sur le changement d'orientation dans android

ajouter android:configChanges="keyboardHidden|orientation" à votre AndroidManifest.XML. Cela indique au système les modifications de configuration que vous allez gérer vous-même - dans ce cas, en ne faisant rien.

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

Voir la référence du Développeur configChanges pour plus de détails.

cependant, votre application peut être interrompue à tout moment, par exemple par un appel téléphonique, de sorte que vous devriez vraiment ajouter du code pour sauver l'état de votre application quand il est arrêté.

mise à jour: à partir D'Android 3.2, vous devez également ajouter "screenSize":

<activity
    android:name="MainActivity"
    android:screenOrientation="portrait"
    android:configChanges="keyboardHidden|orientation|screenSize">

Du guide du Développeur Manipulation de la Configuration de Modifier Vous-même

attention: en commençant par Android 3.2( niveau API 13), la " taille de l'écran" change également lorsque l'appareil passe d'un portrait à un paysage orientation. Ainsi, si vous voulez empêcher le redémarrage de l'exécution changement d'orientation lors du développement pour les API de niveau 13 ou plus (comme déclaré par minSdkVersion et targetSdkVersion les attributs de), vous doit inclure le "screenSize" valeur en plus de l'orientation "" valeur. C'est, vous devez déclarer android:configChanges="orientation|screenSize" . Toutefois, si votre l'application cible le niveau D'API 12 ou inférieur, puis votre activité toujours gérer cette configuration changer lui-même (ce changement de configuration ne redémarre pas votre activité, même sur Android 3.2 ou dispositif supérieur).

306
répondu Intrications 2018-03-15 09:15:21

vous devez modifier AndroidManifest.xml comme Intrications (précédemment Ashton) mentionné et assurez-vous que l'activité traite l'événement modifié onconfigurationcomm e vous voulez qu'il soit traité. Voici à quoi ça devrait ressembler:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
94
répondu ubershmekel 2017-05-23 12:26:20

j'ai toujours trouvé que vous aviez besoin des deux

android:screenOrientation="nosensor" android:configChanges="keyboardHidden|orientation"
39
répondu m00sey 2011-07-09 19:42:34

comme dit, Mettez android:configChanges de votre activité (dans le fichier manifeste) à keyboardHidden|orientation et puis:

1) Remplacer onConfigurationChanged()

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    //here you can handle orientation change
}

2) Ajoutez cette ligne à votre activité onCreate()

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

c'est mieux que d'ajouter la même ligne à onConfigurationChanged , parce que votre application va passer en mode portrait puis revenir en mode paysage (ça n'arrivera qu'une fois, mais c'est ennuyeux).

vous aussi peuvent ensemble android:screenOrientation="nosensor" pour votre activité (dans le manifeste). mais en utilisant cette façon vous n'êtes pas en mesure de gérer les changements d'orientation du tout.

22
répondu Dmitry Zaytsev 2012-08-21 12:04:47

utilisez ceci..

    android:screenOrientation="portrait"
20
répondu Muhammad Aamir Ali 2013-04-03 15:00:51

dans la méthode OnCreate de votre activité utilisez ce code:

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

maintenant votre orientation sera réglée sur portrait et ne changera jamais.

13
répondu Numenor 2012-09-07 08:55:25

dans L'AndroidManifest.fichier xml, pour chaque activité que vous voulez verrouiller ajouter la dernière ligne screenOrientation :

android:label="@string/app_name"
android:name=".Login"
android:screenOrientation="portrait" >

Ou android:screenOrientation="paysage", .

10
répondu Gil Allen 2016-03-04 20:15:06

dans votre androidmanifest.xml fichier:

   <activity android:name="MainActivity" android:configChanges="keyboardHidden|orientation">

ou

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
8
répondu Jorgesys 2016-03-04 20:13:57

pour verrouiller l'écran par code, vous devez utiliser la rotation réelle de l'écran (0, 90, 180, 270) et vous devez connaître la position naturelle de celui-ci, dans un smartphone la position naturelle sera portrait et dans une tablette, il sera paysage.

voici le code (méthodes de verrouillage et de déverrouillage), il a été testé sur certains appareils (smartphones et tablettes) et il fonctionne très bien.

public static void lockScreenOrientation(Activity activity)
{   
    WindowManager windowManager =  (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);   
    Configuration configuration = activity.getResources().getConfiguration();   
    int rotation = windowManager.getDefaultDisplay().getRotation(); 

    // Search for the natural position of the device    
    if(configuration.orientation == Configuration.ORIENTATION_LANDSCAPE &&  
       (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) ||  
       configuration.orientation == Configuration.ORIENTATION_PORTRAIT &&   
       (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270))   
    {   
        // Natural position is Landscape    
        switch (rotation)   
        {   
            case Surface.ROTATION_0:    
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);    
                break;      
            case Surface.ROTATION_90:   
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); 
            break;      
            case Surface.ROTATION_180: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); 
                break;          
            case Surface.ROTATION_270: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
                break;
        }
    }
    else
    {
        // Natural position is Portrait
        switch (rotation) 
        {
            case Surface.ROTATION_0: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
            break;   
            case Surface.ROTATION_90: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
            break;   
            case Surface.ROTATION_180: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); 
                break;          
            case Surface.ROTATION_270: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); 
                break;
        }
    }
}

public static void unlockScreenOrientation(Activity activity)
{
    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
5
répondu PoOk 2013-05-16 10:31:40

Dans Visual Studio Xamarin:

  1. ajouter:

using Android.Content.PM; à vous de l'activité de l'espace de noms de la liste.

  1. ajouter:

[Activity(ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait)]

comme un attribut de votre classe, comme ça:

[Activity(ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : Activity
{...}
2
répondu Roy Doron 2016-11-14 13:36:44

ajouter

android:configChanges="keyboardHidden|orientation|screenSize" 

à votre manifeste.

0
répondu saurabh 2016-03-04 20:14:35

s'il vous Plaît noter, aucune des méthodes semble fonctionner maintenant!

In Android Studio 1 une façon simple est d'ajouter android:screenOrientation="nosensor" .

cela bloque efficacement l'orientation de l'écran.

0
répondu kephalian 2016-03-04 20:17:55