Como posso obter a orientação atual da tela?


190

Eu só quero definir alguns sinalizadores quando minha orientação estiver na paisagem para que, quando a atividade for recriada em onCreate (), eu possa alternar entre o que carregar no retrato em relação à paisagem. Eu já tenho um xml de layout-land que está lidando com meu layout.

public void onConfigurationChanged(Configuration _newConfig) {

        if (_newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            this.loadURLData = false;
        }

        if (_newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            this.loadURLData = true;
        }

        super.onConfigurationChanged(_newConfig);
    }

Substituir onConfigurationChanged impedirá que meu xml de layout-land seja carregado na orientação paisagem.

Eu só quero obter a orientação atual do meu dispositivo em onCreate (). Como posso conseguir isso?

Respostas:


474
Activity.getResources().getConfiguration().orientation

8
Isso fornece apenas dois valores ORIENTATION_PORTRAIT e ORIENTATION_LANDSCAPE. Existe uma maneira de obter todos os quatro valores do ActivityInfo? (Ou seja, LANDSCAPE_REVERSE e PORTRAIT_REVERSE)
HRJ

18
@HRJ você pode usar getWindowManager (). GetDefaultDisplay (). GetRotation ()
MKJParekh

24
getWindowManager (). getDefaultDisplay (). getRotation () retorna a rotação com referência à orientação "natural" da tela, ou seja, para um tablet, ele retornaria Surface.ROTATION_0 no modo paisagem, enquanto para um telefone celular retornaria o mesmo valor para retrato.
Zoltán

64
int orientation = this.getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
    // code for portrait mode
} else {
    // code for landscape mode
}

Quando a superclasse de thiséContext


28

Em alguns dispositivos, void onConfigurationChanged()podem falhar. O usuário usará esse código para obter a orientação atual da tela.

public int getScreenOrientation()
{
    Display getOrient = getActivity().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;
}

E use

if (orientation==1)        // 1 for Configuration.ORIENTATION_PORTRAIT
{                          // 2 for Configuration.ORIENTATION_LANDSCAPE
   //your code             // 0 for Configuration.ORIENTATION_SQUARE
}

1
Observe que getOrient.getWidth () e getOrient.getHeight () estão obsoletos agora.
Valerybodak 27/03/2015

Deve ser marcado como a resposta correta como é forma mais detalhada
Zapnologica

1
Deve ser marcado como resposta correta e funciona melhor em todas as condições. Mas observe como um rival disse que getActivity (). GetWindowManager (). GetDefaultDisplay (). GetWidth () e getHeight () estão obsoletos agora. Por favor, use getSize (Point outsize). Ele pode ser usado como passagem de um novo objeto de ponto e que obterá seus membros x e y.
Mahendra Chhimwal

como Point outSize = new point (); getOrient.getSize (outSize); if (outSize.x == outSize.y) retorna SQUARE;
Mahendra Chhimwal

Pensei em salientar que o Configuration.ORIENTATION_SQUARE foi descontinuado e, embora tenha sido definido como 0 em 2013, é definido como 3, enquanto Configuration.ORIENTIATION_UNDEFINED é definido como 0. Saúde.
Dave

26
int rotation =  getWindowManager().getDefaultDisplay().getRotation();

isso dará toda orientação como normal e reversa

e lidar com isso como

int angle = 0;
switch (rotation) {
    case Surface.ROTATION_90:
        angle = -90;
        break;
    case Surface.ROTATION_180:
        angle = 180;
        break;
    case Surface.ROTATION_270:
        angle = 90;
        break;
    default:
        angle = 0;
        break;
}

final int angle = (rotation == Surface.ROTATION_90) ? 90 : (rotation == Surface.ROTATION_180) ? 180 : (rotation == Surface.ROTATION_270) ? 270 : 0;
Andrey Syrokomskiy

12
getActivity().getResources().getConfiguration().orientation

esse comando retorna o valor int 1 para Retrato e 2 para Paisagem



1

Na sua classe de atividade, use o método abaixo:

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

        // Checks the orientation of the screen
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {

            setlogo();// Your Method
            Log.d("Daiya", "ORIENTATION_LANDSCAPE");

        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {

            setlogoForLandScape();// Your Method
            Log.d("Daiya", "ORIENTATION_PORTRAIT");
        }
    }

Em seguida, para declarar que sua atividade lida com uma alteração na configuração, edite o elemento apropriado no arquivo de manifesto para incluir o android:configChangesatributo com um valor que represente a configuração que você deseja manipular. Os possíveis valores estão listados na documentação do android:configChangesatributo (os valores mais usados ​​são "orientação" para impedir reinicializações quando a orientação da tela muda e "keyboardHidden" para impedir reinicializações quando a disponibilidade do teclado é alterada). Você pode declarar vários valores de configuração no atributo, separando-os com um pipe | personagem.

<activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden"
          android:label="@string/app_name">

Isso é tudo!!


0

se você deseja substituir esse método onConfigurationChanged e ainda deseja que ele faça o básico, considere usar super.onConfigyrationChanged () como a primeira instrução no método substituído.


0

Eu só quero propor outra alternativa que diga respeito a alguns de vocês:

android:configChanges="orientation|keyboardHidden" 

implica que declaramos explicitamente o layout a ser injetado.

Caso desejemos manter a injeção automática, graças às pastas layout-land e layout. Tudo o que você precisa fazer é adicioná-lo ao onCreate:

    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
        getSupportActionBar().hide();

    } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        getSupportActionBar().show();
    }

Aqui, exibimos ou não a barra de ação, dependendo da orientação do telefone

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.