Question

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

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 en mode portrait, mais il semble se remis en marche et perd tous ses états. Cela ne se produit pas avec le version de HTC Hero.

Mon application est assez grand, donc je ne veux pas de redémarrer et de perdre tous ses états lorsque le clavier est ouvert. Comment puis-je empêcher cela?

Était-ce utile?

La solution

Mise à jour Avril 2013: Ne pas faire cela. Ce ne fut pas une bonne idée en 2009 quand je répondu à la question et il est vraiment pas une bonne idée maintenant. Voir cette réponse par hackbod pour des raisons:

Évitez rechargeant 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 référence développeur configChanges pour plus de détails.

Cependant, l'application peut être interrompue à tout moment, par exemple par un appel téléphonique, de sorte que vous devriez vraiment ajouter du code pour enregistrer l'état de votre application lorsqu'elle est en pause.

Mise à jour: Comme d'Android 3.2, vous devez également ajouter "ScreenSize":

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

du guide développeur Gestion de la configuration changement vous-même

  

Mise en garde: En commençant par Android 3.2 (niveau API 13), la "taille de l'écran"   change également lorsque l'appareil passe entre les modes portrait et paysage   orientation. Ainsi, si vous voulez éviter le redémarrage d'exécution en raison de   changement d'orientation lors du développement pour le niveau de l'API 13 ou plus (comme   Déclarant la minSdkVersion et les attributs targetSdkVersion), vous   doit inclure la valeur « ScreenSize » en plus de la « orientation »   valeur. Autrement dit, vous devez déclarer   android:configChanges="orientation|screenSize". Toutefois, si votre   objectifs d'application de niveau API 12 ou moins, votre activité toujours   gère ce changement de configuration lui-même (ce changement de configuration   ne redémarre pas votre activité, même lors de l'exécution sur un Android 3.2 ou   dispositif supérieur).

Autres conseils

Vous devez modifier AndroidManifest.xml comme intrications (anciennement Ashton) mentionné et assurez-vous que l'activité gère l'événement onConfigurationChanged comme vous le souhaitez traité. Voici comment cela devrait ressembler à:

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

Je l'ai toujours trouvé que vous avez besoin à la fois

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

Comme dit, définissez android:configChanges de votre activité (dans le fichier manifeste) à keyboardHidden|orientation puis:

1) Remplacer onConfigurationChanged()

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

2) Ajouter cette ligne à la onCreate() de votre activité

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

Il vaut mieux que d'ajouter une même ligne à onConfigurationChanged, parce que votre application tournera en mode portrait, puis de nouveau au paysage (il se produira qu'une seule fois, mais il est ennuyeux).

Vous pouvez également définir android:screenOrientation="nosensor" pour votre activité (dans le manifeste). Mais en utilisant cette façon, vous êtes pas en mesure de gérer l'orientation change du tout.

Cette ..

    android:screenOrientation="portrait"

Dans la méthode OnCreate de votre activité utiliser ce code:

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

Maintenant, votre orientation sera réglé sur le portrait et ne changera jamais.

Dans le fichier AndroidManifest.xml, pour chaque activité que vous voulez verrouiller ajouter la dernière ligne de screenOrientation:

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

ou android. ScreenOrientation = "paysage"

Dans 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);
}

Pour verrouiller l'écran par le code que 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 une tablette, il sera paysage.

Voici le code (verrouiller et déverrouiller les méthodes), il a été testé dans 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);
}

Dans Visual Studio Xamarin:

  1. Ajouter:

using Android.Content.PM; vous liste d'espace de noms d'activité.

  1. Ajouter:

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

comme un attribut de vous classe, comme ça:

[Activity(ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : Activity
{...}

Ajouter

android:configChanges="keyboardHidden|orientation|screenSize" 

à votre manifeste.

scroll top