Controlla l'orientamento sul telefono Android


Risposte:


676

La configurazione corrente, utilizzata per determinare quali risorse recuperare, è disponibile dall'oggetto Risorse Configuration:

getResources().getConfiguration().orientation;

Puoi verificare l'orientamento osservando il suo valore:

int orientation = getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
    // In landscape
} else {
    // In portrait
}

Ulteriori informazioni sono disponibili nello sviluppatore Android .


2
Oh scusa, ho capito male, pensavo che stavi dicendo che il servizio non vedrebbe la modifica della configurazione se la configurazione cambia. Quello che stai descrivendo è che ... beh, non vede nulla, perché nulla sta cambiando, perché il programma di avvio ha bloccato l'orientamento dello schermo e non gli consente di cambiare. Quindi è corretto che l'orientamento non cambi, perché l'orientamento non è cambiato. Lo schermo è ancora in verticale.
hackbod,

La cosa più vicina che posso fare è leggere l'orientamento dai sensori che coinvolge la matematica che non sono davvero troppo entusiasta di capire al momento.
Archimede Trajano,

13
Non c'è nulla di cui seccarsi. Lo schermo non ha ruotato, è ancora in verticale, non c'è rotazione per vedere. Se si desidera monitorare il modo in cui l'utente sta spostando il proprio telefono indipendentemente da come viene ruotato lo schermo, quindi sì, è necessario guardare direttamente il sensore e decidere come si desidera interpretare le informazioni ottenute su come si sta muovendo il dispositivo.
hackbod,

4
Ciò fallirà se l'orientamento dello schermo è fisso.
AndroidDev

7
Se l'attività blocca il display ( android:screenOrientation="portrait"), questo metodo restituirà lo stesso valore indipendentemente da come l'utente ruota il dispositivo. In tal caso useresti l'accelerometro o il sensore di gravità per capire correttamente l'orientamento.
Gatto

169

Se usi l'orientamento di getResources (). GetConfiguration (). Su alcuni dispositivi, lo sbaglierai. Inizialmente abbiamo utilizzato questo approccio su http://apphance.com . Grazie alla registrazione remota di Apphance abbiamo potuto vederlo su diversi dispositivi e abbiamo visto che la frammentazione gioca il suo ruolo qui. Ho visto casi strani: ad esempio alternando ritratto e quadrato (?!) su HTC Desire HD:

CONDITION[17:37:10.345] screen: rotation: 270 orientation: square
CONDITION[17:37:12.774] screen: rotation: 0 orientation: portrait
CONDITION[17:37:15.898] screen: rotation: 90
CONDITION[17:37:21.451] screen: rotation: 0
CONDITION[17:38:42.120] screen: rotation: 270 orientation: square

o non cambiare affatto l'orientamento:

CONDITION[11:34:41.134] screen: rotation: 0
CONDITION[11:35:04.533] screen: rotation: 90
CONDITION[11:35:06.312] screen: rotation: 0
CONDITION[11:35:07.938] screen: rotation: 90
CONDITION[11:35:09.336] screen: rotation: 0

D'altra parte, width () e height () sono sempre corretti (è usato dal gestore delle finestre, quindi dovrebbe essere meglio). Direi che l'idea migliore è quella di fare SEMPRE la larghezza / altezza. Se pensi a un momento, questo è esattamente ciò che vuoi: sapere se la larghezza è inferiore all'altezza (ritratto), l'opposto (paesaggio) o se sono uguali (quadrati).

Quindi arriva a questo semplice codice:

public int getScreenOrientation()
{
    Display getOrient = getWindowManager().getDefaultDisplay();
    int orientation = Configuration.ORIENTATION_UNDEFINED;
    if(getOrient.getWidth()==getOrient.getHeight()){
        orientation = Configuration.ORIENTATION_SQUARE;
    } else{ 
        if(getOrient.getWidth() < getOrient.getHeight()){
            orientation = Configuration.ORIENTATION_PORTRAIT;
        }else { 
             orientation = Configuration.ORIENTATION_LANDSCAPE;
        }
    }
    return orientation;
}

3
Grazie! L'inizializzazione dell '"orientamento" è però superflua.
MrMaffen,

getWidthe getHeightnon sono deprecati.
FindOut_Quran,

3
@ user3441905, sì, lo sono. Usa getSize(Point outSize)invece. Sto usando API 23.
WindRider

@ jarek-potiuk è deprecato.
Ade,

53

Un altro modo di risolvere questo problema è non basarsi sul valore di ritorno corretto dal display ma fare affidamento sulla risoluzione delle risorse Android.

Crea il file layouts.xmlnelle cartelle res/values-lande res/values-portcon il seguente contenuto:

res / valori-terra / layouts.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="is_landscape">true</bool>
</resources>

res / valori-port / layouts.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="is_landscape">false</bool>
</resources>

Nel tuo codice sorgente ora puoi accedere all'orientamento corrente come segue:

context.getResources().getBoolean(R.bool.is_landscape)

1
Mi piace perché usa il modo in cui il sistema sta già determinando l'orientamento
KrustyGString,

1
La migliore risposta per il controllo orizzontale / verticale!
vtlinh,

Quale sarà il suo valore nel file dei valori predefiniti?
Shashank Mishra,

46

Un modo completo per specificare l'orientamento corrente del telefono:

    public String getRotation(Context context){
    final int rotation = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getOrientation();
           switch (rotation) {
            case Surface.ROTATION_0:
                return "portrait";
            case Surface.ROTATION_90:
                return "landscape";
            case Surface.ROTATION_180:
                return "reverse portrait";
            default:
                return "reverse landscape";
            }
        }

Chear Binh Nguyen


6
C'è un refuso nel tuo post - dovrebbe dire .getRotation () non getOrientation
Keith

1
+1 per questo. Avevo bisogno di conoscere l'orientamento esatto, non solo il paesaggio rispetto al ritratto. getOrientation () è corretto a meno che tu non sia su SDK 8+, nel qual caso dovresti usare getRotation (). Le modalità "inversa" sono supportate in SDK 9+.
Paolo,

6
@Keith @Paul Non ricordo come getOrientation()funziona, ma non è corretto se utilizzato getRotation(). Ottieni la "Returns the rotation of the screen from its "natural" orientation." fonte di rotazione . Quindi su un telefono che dice che ROTATION_0 è probabilmente ritratto verticale, ma su un tablet il suo orientamento "naturale" è probabilmente orizzontale e ROTATION_0 dovrebbe restituire paesaggio anziché verticale.
jp36,

Sembra che questo sia il metodo preferito unisciti avanti: developer.android.com/reference/android/view/…
jaysqrd

Questa è una risposta sbagliata Perché è stato votato? getOrientation (valori float [] R, float []) calcola l'orientamento del dispositivo in base alla matrice di rotazione.
user1914692

29

Ecco la demo dello snippet di codice su come ottenere l'orientamento dello schermo consigliato da hackbod e Martijn :

❶ Attiva quando cambia orientamento:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
        int nCurrentOrientation = _getScreenOrientation();
    _doSomeThingWhenChangeOrientation(nCurrentOrientation);
}

❷ Ottieni l'orientamento attuale come consiglia hackbod :

private int _getScreenOrientation(){    
    return getResources().getConfiguration().orientation;
}

❸ Esistono soluzioni alternative per ottenere l'orientamento attuale dello schermo ❷ seguire la soluzione Martijn :

private int _getScreenOrientation(){
        Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
        return display.getOrientation();
}

Nota : ho provato entrambi a implementare ❷ & ❸, ma su RealDevice (NexusOne SDK 2.3) Orientamento restituisce l'orientamento errato.

★ Quindi consiglio di utilizzare la soluzione ❷ per ottenere l'orientamento dello schermo che ha più vantaggi: chiaramente, semplice e funziona come un fascino.

★ Controlla attentamente il ritorno dell'orientamento per assicurarti che sia corretto come previsto (potrebbe essere limitato a seconda delle specifiche dei dispositivi fisici)

Spero che ti aiuti


16
int ot = getResources().getConfiguration().orientation;
switch(ot)
        {

        case  Configuration.ORIENTATION_LANDSCAPE:

            Log.d("my orient" ,"ORIENTATION_LANDSCAPE");
        break;
        case Configuration.ORIENTATION_PORTRAIT:
            Log.d("my orient" ,"ORIENTATION_PORTRAIT");
            break;

        case Configuration.ORIENTATION_SQUARE:
            Log.d("my orient" ,"ORIENTATION_SQUARE");
            break;
        case Configuration.ORIENTATION_UNDEFINED:
            Log.d("my orient" ,"ORIENTATION_UNDEFINED");
            break;
            default:
            Log.d("my orient", "default val");
            break;
        }

13

Usa getResources().getConfiguration().orientationè nel modo giusto.

Devi solo fare attenzione ai diversi tipi di paesaggi, il paesaggio che il dispositivo utilizza normalmente e l'altro.

Ancora non capisco come gestirlo.


12

È passato del tempo da quando sono state pubblicate la maggior parte di queste risposte e alcune utilizzano metodi e costanti ormai obsoleti.

Ho aggiornato il codice di Jarek per non utilizzare più questi metodi e costanti:

protected int getScreenOrientation()
{
    Display getOrient = getWindowManager().getDefaultDisplay();
    Point size = new Point();

    getOrient.getSize(size);

    int orientation;
    if (size.x < size.y)
    {
        orientation = Configuration.ORIENTATION_PORTRAIT;
    }
    else
    {
        orientation = Configuration.ORIENTATION_LANDSCAPE;
    }
    return orientation;
}

Si noti che la modalità Configuration.ORIENTATION_SQUAREnon è più supportata.

Ho trovato questo affidabile su tutti i dispositivi su cui l'ho testato in contrasto con il metodo che suggerisce l'utilizzo di getResources().getConfiguration().orientation


Nota che getOrient.getSize (size) richiede 13 livelli api
Lester

6

Controlla l'orientamento dello schermo in fase di esecuzione.

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();

    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();        
    }
}

5

C'è un altro modo per farlo:

public int getOrientation()
{
    if(getResources().getDisplayMetrics().widthPixels>getResources().getDisplayMetrics().heightPixels)
    { 
        Toast t = Toast.makeText(this,"LANDSCAPE",Toast.LENGTH_SHORT);
        t.show();
        return 1;
    }
    else
    {
        Toast t = Toast.makeText(this,"PORTRAIT",Toast.LENGTH_SHORT);
        t.show();
        return 2;
    }       
}


4

Testato nel 2019 su API 28, indipendentemente dal fatto che l'utente abbia impostato o meno l'orientamento verticale e con un codice minimo rispetto a un'altra risposta obsoleta , quanto segue offre l'orientamento corretto:

/** @return The {@link Configuration#ORIENTATION_SQUARE}, {@link Configuration#ORIENTATION_PORTRAIT}, {@link Configuration#ORIENTATION_LANDSCAPE} constants based on the current phone screen pixel relations. */
private int getScreenOrientation()
{
    DisplayMetrics dm = context.getResources().getDisplayMetrics(); // Screen rotation effected

    if(dm.widthPixels == dm.heightPixels)
        return Configuration.ORIENTATION_SQUARE;
    else
        return dm.widthPixels < dm.heightPixels ? Configuration.ORIENTATION_PORTRAIT : Configuration.ORIENTATION_LANDSCAPE;
}

2

Penso che questo codice potrebbe funzionare dopo che il cambiamento di orientamento ha avuto effetto

Display getOrient = getWindowManager().getDefaultDisplay();

int orientation = getOrient.getOrientation();

sovrascrivere la funzione Activity.onConfigurationChanged (Configurazione newConfig) e utilizzare newConfig, orientamento se si desidera ricevere una notifica sul nuovo orientamento prima di chiamare setContentView.


2

penso che usare getRotationv () non sia d'aiuto perché http://developer.android.com/reference/android/view/Display.html#getRotation%28%29 getRotation () Restituisce la rotazione dello schermo dal suo "naturale" orientamento.

quindi, a meno che non si conosca l'orientamento "naturale", la rotazione non ha senso.

ho trovato un modo più semplice,

  Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
  Point size = new Point();
  display.getSize(size);
  int width = size.x;
  int height = size.y;
  if(width>height)
    // its landscape

per favore dimmi se c'è un problema con questo qualcuno?


2

tale si sovrappone a tutti i telefoni come oneplus3

public static boolean isScreenOriatationPortrait(Context context) {
         return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;
         }

codice giusto come segue:

public static int getRotation(Context context){
        final int rotation = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getOrientation();

        if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180){
            return Configuration.ORIENTATION_PORTRAIT;
        }

        if(rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270){
            return Configuration.ORIENTATION_LANDSCAPE;
        }

        return -1;
    }

1

Vecchio post lo so. Qualunque sia l'orientamento può essere o viene scambiato, ecc. Ho progettato questa funzione che viene utilizzata per impostare il dispositivo nell'orientamento corretto senza la necessità di sapere come sono organizzate le caratteristiche del ritratto e del paesaggio sul dispositivo.

   private void initActivityScreenOrientPortrait()
    {
        // Avoid screen rotations (use the manifests android:screenOrientation setting)
        // Set this to nosensor or potrait

        // Set window fullscreen
        this.activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

        DisplayMetrics metrics = new DisplayMetrics();
        this.activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);

         // Test if it is VISUAL in portrait mode by simply checking it's size
        boolean bIsVisualPortrait = ( metrics.heightPixels >= metrics.widthPixels ); 

        if( !bIsVisualPortrait )
        { 
            // Swap the orientation to match the VISUAL portrait mode
            if( this.activity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT )
             { this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); }
            else { this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ); }
        }
        else { this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); }

    }

Funziona come un fascino!


1

Usa in questo modo,

    int orientation = getResources().getConfiguration().orientation;
    String Orintaion = "";
    switch (orientation)
    {
        case Configuration.ORIENTATION_UNDEFINED: Orintaion = "Undefined"; break;
        case Configuration.ORIENTATION_LANDSCAPE: Orintaion = "Landscrape"; break;
        case Configuration.ORIENTATION_PORTRAIT:  Orintaion = "Portrait"; break;
        default: Orintaion = "Square";break;
    }

nella corda hai l'Oriantion


1

ci sono molti modi per farlo, questo pezzo di codice funziona per me

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

1

Penso che questa soluzione sia facile

if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
  user_todat_latout = true;
} else {
  user_todat_latout = false;
}

In generale, le risposte sono molto più utili se includono una spiegazione di ciò che il codice è destinato a fare e perché risolve il problema senza introdurre altri.
Tom Aranda,

si scusa per quello che pensavo non fosse necessario spiegare esattamente questo blocco di orientamento del controllo del codice se uguale Configuration.ORIENTATION_PORTRAIT è un'app media in verticale :)
Issac Nabil il

1

Solo un semplice codice a due righe

if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
    // do something in landscape
} else {
    //do in potrait
}

0

Semplice e facile :)

  1. Crea 2 layout xml (ovvero verticale e orizzontale)
  2. Nel file java, scrivi:

    private int intOrientation;

    al onCreatemetodo e prima di setContentViewscrivere:

    intOrientation = getResources().getConfiguration().orientation;
    if (intOrientation == Configuration.ORIENTATION_PORTRAIT)
        setContentView(R.layout.activity_main);
    else
        setContentView(R.layout.layout_land);   // I tested it and it works fine.

0

Vale anche la pena notare che al giorno d'oggi, ci sono meno buone ragioni per verificare l'orientamento esplicito con getResources().getConfiguration().orientationse lo stai facendo per motivi di layout, poiché il supporto multi-finestra introdotto in Android 7 / API 24+ potrebbe rovinare un po 'i tuoi layout in entrambi orientamento. Meglio considerare l'utilizzo <ConstraintLayout>e i layout alternativi che dipendono dalla larghezza o dall'altezza disponibili , insieme ad altri trucchi per determinare quale layout viene utilizzato, ad esempio la presenza o meno di determinati frammenti attaccati alla tua attività.


0

Puoi usarlo (basato su qui ):

public static boolean isPortrait(Activity activity) {
    final int currentOrientation = getCurrentOrientation(activity);
    return currentOrientation == ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT || currentOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
}

public static int getCurrentOrientation(Activity activity) {
    //code based on https://www.captechconsulting.com/blog/eric-miles/programmatically-locking-android-screen-orientation
    final Display display = activity.getWindowManager().getDefaultDisplay();
    final int rotation = display.getRotation();
    final Point size = new Point();
    display.getSize(size);
    int result;
    if (rotation == Surface.ROTATION_0
            || rotation == Surface.ROTATION_180) {
        // if rotation is 0 or 180 and width is greater than height, we have
        // a tablet
        if (size.x > size.y) {
            if (rotation == Surface.ROTATION_0) {
                result = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
            } else {
                result = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
            }
        } else {
            // we have a phone
            if (rotation == Surface.ROTATION_0) {
                result = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
            } else {
                result = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
            }
        }
    } else {
        // if rotation is 90 or 270 and width is greater than height, we
        // have a phone
        if (size.x > size.y) {
            if (rotation == Surface.ROTATION_90) {
                result = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
            } else {
                result = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
            }
        } else {
            // we have a tablet
            if (rotation == Surface.ROTATION_90) {
                result = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
            } else {
                result = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
            }
        }
    }
    return result;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.