web-dev-qa-db-fra.com

comment détecter l'orientation d'un appareil Android?

Est-il possible de détecter l'orientation actuelle d'un appareil Android sans programmer un auditeur et sans manipuler la matrice de positions? Dans mon application, je souhaite uniquement connaître l'orientation actuelle - verticale ou horizontale - pour le moment. Cependant, je ne veux pas écouter les événements d'axiométrie ou d'autres événements.

45
Mark

Utilisez la méthode getRotation :

Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int rotation = display.getRotation();

De la documentation:

Renvoie la rotation de l'écran à partir de son orientation "naturelle". La valeur renvoyée peut être Surface.ROTATION_0 (pas de rotation), Surface.ROTATION_90, Surface.ROTATION_180 ou Surface.ROTATION_270. Par exemple, si un périphérique a un grand écran et que l'utilisateur l'a tourné sur le côté pour passer en orientation paysage, la valeur renvoyée ici peut être Surface.ROTATION_90 ou Surface.ROTATION_270, en fonction de la direction dans laquelle il a été tourné. L'angle est la rotation des graphiques dessinés sur l'écran, qui est le sens opposé à la rotation physique de l'appareil. Par exemple, si vous faites pivoter le périphérique de 90 degrés dans le sens inverse des aiguilles d'une montre, le rendu sera pivoté de 90 degrés dans le sens des aiguilles d'une montre; la valeur renvoyée ici sera donc Surface.ROTATION_90

Gardez à l'esprit que getRotation a été introduit à partir d'Android 2.2. Utilisez getOrientation si votre cible est constituée de périphériques plus anciens.

64
Cristian

Vous pouvez aussi utiliser:

getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE

Il y a un article de Nice sur ce sujet qui est à lire: Un tour d’écran mérite un autre

7
FerranB

Vous avez juste besoin de connaître la hauteur et la largeur de votre toile ... votre surface ... votre moniteur ... etc.

peut-être que vous pouvez l'obtenir avec:

if (canvas.getHeight()>canvas.getWidth() ) {
//portrait
}
else
{
//landscape
}
1
ORParga

Vous pouvez créer une fonction d'extension à partir du code ci-dessus:

fun AppCompatActivity.getRotation(): Int{
    val display = (baseContext.getSystemService(Context.WINDOW_SERVICE) as WindowManager).defaultDisplay
    val rotation = display.rotation
    when(rotation){
        Surface.ROTATION_90 -> return R.integer.LANDSCAPE
        Surface.ROTATION_270 -> return R.integer.LANDSCAPE
        Surface.ROTATION_180 -> return R.integer.PORTRAIT
        Surface.ROTATION_0 -> return R.integer.PORTRAIT
        else ->
            return R.integer.PORTRAIT
    }
}

Dans votre répertoire de ressources, créez un fichier constants.xml avec le contenu suivant:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="LANDSCAPE">0</integer>
    <integer name="PORTRAIT">1</integer>
</resources>

Votre code est alors aussi simple que (par exemple, une disposition verticale/horizontale pour une vue de recyclage dans un fragment

val a  = activity as AppCompatActivity
        val orientation = a.getRotation()
        when (orientation){
            R.integer.PORTRAIT -> rv.layoutManager = LinearLayoutManager(activity, RecyclerView.VERTICAL,false)
            R.integer.LANDSCAPE -> rv.layoutManager = LinearLayoutManager(activity, RecyclerView.HORIZONTAL,false)
        }
1
Jens Buysse

Je pense que le moyen le plus sûr et le plus simple consiste à ajouter une balise pour certains éléments de votre activité en XML. Par exemple, définissez la balise du viewpager sur "portrait" dans la présentation de portrait et sur "paysage" dans dans paysage. Ensuite, dans votre recherche oncreate pour cette balise, comme ceci:

if(mViewpager.getTag().equals("portrait"))
  // is in portrait
else
  // is in landscape
1
9patchcoder

Cela peut ne pas être pertinent, mais si vous devez le savoir par hasard, car vous souhaitez verrouiller le périphérique dans son orientation actuelle, vous pouvez basculer entre les deux lignes de code suivantes.

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
0
user2288580