web-dev-qa-db-fra.com

Android détermine l'orientation de l'écran au moment de l'exécution

Voici un pseudo-code pour détecter un événement de rotation d'écran et décider de conserver ou de modifier l'orientation de l'écran.

public boolean onOrientationChanges(orientation) {
  if(orientation == landscape)
    if(settings.get("lock_orientation"))
      return false;   // Retain portrait mode
    else
      return true; // change to landscape mode

  return true; 
}

Comment puis-je faire des choses similaires dans Android?

EDIT: Je cherche en fait la réponse sur Où gérer les changements d’orientation . Je ne veux pas corriger l'orientation en ajoutant screenOrientation = "portrait". 

J'ai besoin de quelque chose, similaire à onConfigurationChanges (), où je peux gérer l'orientation, mais je n'ai pas besoin de redessiner manuellement la vue.

20
Yong Fei

Vous avez d’abord besoin d’une instance Display:

Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();

Ensuite, l'orientation peut s'appeler comme ceci:

int orientation = display.getOrientation();

Vérifiez l’orientation de votre choix et utilisez-la pour modifier l’orientation:

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

J'espère que ça aide.

Mettre à jour

OK, supposons que vous ayez une variable oAllow qui est Boolean et une valeur par défaut False.

public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
    int orientation = display.getOrientation(); 
    switch(orientation) {
        case Configuration.ORIENTATION_PORTRAIT:
            if(!oAllow) {
                    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            }
            break;
        case Configuration.ORIENTATION_LANDSCAPE:
            if(!oAllow) {
                    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }
            break;
    }
}

Vous pouvez ajouter plus de choix.

Je n'ai pas essayé cet échantillon, mais au moins, je vous ai donné des indices sur la façon de le résoudre. Dis-moi si tu as une erreur.

METTRE À JOUR

getOrientation() est déjà obsolète voir ici . Utilisez plutôt getRotation(). Pour vérifier si l'appareil est en mode paysage, procédez comme suit:

Display display = ((WindowManager) getSystemService(WINDOW_SERVICE))
        .getDefaultDisplay();

int orientation = display.getRotation();

if (orientation == Surface.ROTATION_90
        || orientation == Surface.ROTATION_270) {
    // TODO: add logic for landscape mode here            
}
44
Ogulcan Orhan

Essayez de courir

getResources().getConfiguration().orientation

À partir de votre objet contexte pour déterminer l’orientation de l’écran au moment de l’exécution, les valeurs possibles sont documentées ici

Pour intercepter l'événement de changement d'orientation, vous pouvez trouver la réponse dans Android Dev Guide: Gestion de la modification de la configuration

Du guide: 

Par exemple, le code manifeste suivant déclare une activité qui gère à la fois le changement d'orientation de l'écran et la disponibilité du clavier changement:

<activité Android: name = ". MyActivity"
Android: configChanges = "orientation | keyboardHidden"
Android: label = "@ string/app_name">

Désormais, lorsque l'une de ces configurations change, MyActivity ne redémarre pas. Au lieu de cela, MyActivity reçoit un appel à onConfigurationChanged (). Cette méthode reçoit un objet de configuration qui spécifie la nouvelle configuration de périphérique. En lisant les champs de la configuration, vous pouvez déterminer la nouvelle configuration et apporter les modifications appropriées en mettant à jour les ressources utilisées dans votre interface. Au moment où cette méthode est appelée, l'objet Ressources de votre activité est mis à jour pour renvoyer des ressources en fonction de la nouvelle configuration. Vous pouvez ainsi facilement réinitialiser des éléments de votre interface utilisateur sans que le système ne redémarre votre activité.

...

18
Talihawk
if (this.getWindow().getWindowManager().getDefaultDisplay()
    .getOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
  // portrait mode
} else if (this.getWindow().getWindowManager().getDefaultDisplay()
           .getOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
  // landscape
}
3
Dwivedi Ji

Vous n'avez pas besoin d'intercepter l'événement, puis de le remplacer. Il suffit d'utiliser:

// Allow rotation
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
// Lock rotation (to Landscape)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE);

Les points à noter ici sont, si sur Jellybean et au-dessus cela permettra une rotation de 180 degrés une fois verrouillé. De plus, une fois déverrouillé, cela ne permet la rotation que si les paramètres principaux de l'utilisateur doivent autoriser la rotation. Vous pouvez interdire les rotations à 180 degrés, remplacer les paramètres principaux et permettre la rotation, et bien plus encore. Vérifiez les options dans ActivityInfo

De plus, si vous avez prédéfini qu’il n’y aura pas de rotation, votre activité ne sera pas détruite puis redémarrée, il vous suffira de redéfinir l’orientation, ce qui entraînera à nouveau le redémarrage de l’activité; Ainsi, définir ce que vous voulez à l’avance peut être beaucoup plus efficace.

Utilisation préalable à Jellybean ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE - pas de rotation à 180 degrés avec cela.

1
Steve Waring

Vérifiez l'orientation de votre écran Android à l'exécution:

ListView listView = (ListView) findViewById(R.id.listView1);
if (getResources().getConfiguration().orientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
    //do work for landscape screen mode.
    listView.setPadding(0, 5, 0, 1);
} else if (getResources().getConfiguration().orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
    //Do work for portrait screen mode.
    listView.setPadding(1, 10, 1, 10);
}
0
Rahul Raina

Une autre solution pour déterminer l'orientation de l'écran:

public boolean isLandscape() {
    return Resources.getSystem().getDisplayMetrics().widthPixels - Resources.getSystem().getDisplayMetrics().heightPixels > 0;
}
0
IQ.feature