Forçar uma atividade do Android a sempre usar o modo paisagem

144

Estou usando o visualizador do Android VNC no meu HTC G1 . Mas, por alguma razão, esse aplicativo está sempre no modo paisagem, apesar do meu G1 estar no modo retrato. Como o visualizador do Android VNC é de código aberto, eu gostaria de saber como é possível codificar uma atividade para ser 'paisagem'. Gostaria de alterá-lo para respeitar a orientação do telefone.

hap497
fonte

Respostas:

188

Olhando para o AndroidManifest.xml ( link ), na linha 9:

<activity android:screenOrientation="landscape" android:configChanges="orientation|keyboardHidden" android:name="VncCanvasActivity">

Essa linha especifica screenOrientationcomo paisagem, mas o autor vai mais longe ao substituir qualquer alteração na orientação da tela configChanges="orientation|keyboardHidden". Isso aponta para uma função substituída no VncCanvasActivity.java.

Se você olhar para VncCanvasActivity, na linha 109 é a função substituída:

@Override
public void onConfigurationChanged(Configuration newConfig) {
  // ignore orientation/keyboard change
  super.onConfigurationChanged(newConfig);
}

O autor especificamente colocou um comentário para ignorar qualquer alteração no teclado ou na orientação.


Se você quiser alterar isso, volte ao arquivo AndroidManifest.xml mostrado acima e altere a linha para:

<activity android:screenOrientation="sensor" android:name="VncCanvasActivity">

Isso deve alterar o programa para alternar entre retrato e paisagem quando o usuário gira o dispositivo.

Isso pode funcionar, mas pode atrapalhar a aparência da GUI, dependendo de como o layout foi criado. Você terá que dar conta disso. Além disso, dependendo de como as atividades são codificadas, você pode perceber que, quando a orientação da tela é alterada, os valores preenchidos em qualquer caixa de entrada desaparecem. Isso também pode ter que ser tratado.

Pulkit Sethi
fonte
3
Por que exatamente o configChangesatributo é necessário? Parece funcionar no meu telefone sem teclado ... Em que situações a orientação mudará para retrato se você screenOrientation="landscape"omitir o configChanges?
precisa saber é o seguinte
como forçar uma atividade interna, como a biblioteca de seleção de imagem do sistema, apenas em paisagem ou apenas retrato?
Jacky
118

Você pode definir os mesmos dados no seu código java também.

myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

Outros valores no ActivityInfo permitirão que você o ajuste novamente para retrato controlado por sensor ou bloqueado. Pessoalmente, gosto de defini-lo como algo no manifesto, conforme sugerido em outra resposta a esta pergunta, e depois alterá-lo posteriormente, usando a chamada acima no SDK do Android, se houver necessidade.

haseman
fonte
@ Yegor Nem sempre. Do android docs:If the activity is currently in the foreground or otherwise impacting the screen orientation, the screen will immediately be changed (possibly causing the activity to be restarted)
Chaitanya
40

No meu OnCreate(Bundle), geralmente faço o seguinte:

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
anwarma
fonte
2
o método manifesto em outras respostas não parecem funcionar, mas a tua @anwarma fez
Anup
31

Você pode especificar a orientação de uma atividade no manifesto. Veja aqui .

<activity android:allowTaskReparenting=["true" | "false"]
...
          android:screenOrientation=["unspecified" | "user" | "behind" |
                                     "landscape" | "portrait" |
                                     "sensor" | "nosensor"]
...
                                       "adjustResize", "adjustPan"] >  
Michael Krauklis
fonte
24

No manifesto:

<activity  android:name=".YourActivity"
android:screenOrientation="portrait"
android:configChanges="orientation|screenSize">

Na sua atividade:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.your_activity_layout);
avisador
fonte
11

A seguir, o código que eu usei para exibir todas as atividades no modo paisagem:

<activity android:screenOrientation="landscape"
          android:configChanges="orientation|keyboardHidden"
          android:name="abcActivty"/>
Megha
fonte
2
"orientação" Se o seu aplicativo de nível alvos API 13 ou superior, então você também deve declarar o "Tamanho do ecrã"
Mina Fawzy
7

Uma solução rápida e simples é para o arquivo AndroidManifest.xml, adicione o seguinte para cada atividade que você deseja forçar ao modo paisagem:

android:screenOrientation="landscape"
joshgoldeneagle
fonte
5

Isso funciona para o Xamarin.Android. Em OnCreate ()

RequestedOrientation = Android.Content.PM.ScreenOrientation.Landscape;
Entre
fonte
4

É isso aí!! Longa espera por essa correção.

Eu tenho um problema antigo do Android sobre iniciar duas atividades que exigiam (programaticamente) o modo paisagem: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)

Agora o Android faz o modo Paisagem no início.

AndrewDC
fonte
3

Arslan, por que você deseja forçar a orientação de forma programática, embora já exista uma maneira de manifestar <activity android:name=".youractivityName" android:screenOrientation="portrait" />

Lua Azul
fonte
eu não sou o autor, mas talvez ele queira forçar programaticamente porque quer forçá-lo em um determinado momento?
Hamzah Malik
1

Fazê-lo no código é IMO errado e, mais ainda, se você o colocar no onCreate. Faça isso no manifesto e o "sistema" conhece a orientação desde a inicialização do aplicativo. E esse tipo de meta ou "orientação" de nível superior DEVE estar no manifesto. Se você quiser provar isso, defina uma pausa no onCreate da atividade. Se você fizer isso no código, ele será chamado duas vezes: inicia no modo Retrato e depois muda para Paisagem. Isso não acontece se você fizer isso no manifesto.

RichieHH
fonte
1
Discordo. Fazer qualquer coisa no código, por oposição a um manifesto, é sempre o meu método preferido. Com base no princípio de responsabilidade única, o manifesto deve se preocupar apenas com propriedades, permissões e ligações da API no nível do aplicativo. Na verdade, eu discordo da marca <activity> estar presente em um manifesto de aplicativo e, portanto, nunca a coloco lá (e funciona bem). Como uma atividade é apresentada é obviamente uma preocupação de apresentação. Sua atividade deve ser a única responsável pela forma como é apresentada e, portanto, costumo colocar toda a lógica de apresentação no código de exibição / atividade.
Come 23/08/16
0

Para o Android 4.0 (Ice Cream Sandwich) e posterior, eu precisava adicioná-los, além do landscapevalor.

android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"

Usar apenas keyboardHidden|orientationainda resultaria em vazamento de memória e recreação de minhas atividades ao pressionar o botão liga / desliga.

Peterdk
fonte
Alerta de más práticas! Isso não tem nada a ver com forçar a atividade no modo paisagem. Você sempre precisa implementar o armazenamento e a recreação do estado de sua atividade. Esse é o conhecimento básico do desenvolvimento Android. Não resolva isso com essa correção hacky. A atividade sempre pode ser fechada pelo sistema se precisar de mais memória.
21717 Roel
@Roel, bem, é a única maneira de impedir que a atividade gire de volta para o retrato quando, por exemplo, você gira o dispositivo. Impede que essas configurações afetem a atividade.
Peterdk
Desculpe pela mensagem um pouco mal-humorada, mas eu testei e não tenho todos esses valores no modo paisagem. Quando você adiciona todos esses valores, significa que você lida com as alterações em onConfigurationChanged (), em vez de a atividade ser apenas reiniciada (e você deve implementá-lo!), Mas se você forçar o landschape, uma rotação não ocorrerá.
Roel
Olá, alguns deles talvez não sejam necessários, mas a omissão de todos eles resultará em problemas estranhos de rotação. Não posso testar agora, mas quando desenvolvia um aplicativo que precisava estar em paisagem o tempo todo, apenas o uso orientation|screensizenão era suficiente em todos os casos. Autorotaria de volta ao retrato.
Peterdk
Essas configurações também são usadas nos anúncios para celular do Google e em outros SDKs de anúncios. Foi daí que os peguei naquele momento.
Peterdk
0

Use o ActivityInfo (android.content.pm.ActivityInfo) em seu método onCreate antes de chamar o método setLayout como este

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Yamikani Sita
fonte
0

use Only
android: screenOrientation = "portrait" tools: ignore = "LockedOrientationActivity"

Vibhu Vikram Singh
fonte
0

Adicionar as seguintes linhas na atividade

Você precisa entrar em todas as atividades

para paisagem

android:screenOrientation="landscape"
tools:ignore="LockedOrientationActivity"

para retrato

android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity"

Aqui o exemplo de MainActivity

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="org.thcb.app">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity"
            android:screenOrientation="landscape"
            tools:ignore="LockedOrientationActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".MainActivity2"
            android:screenOrientation="portrait"
            tools:ignore="LockedOrientationActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
Chetan
fonte
-25

Pressione CTRL+F11para girar a tela.

Yann Pascal DEUNGOUE DJOMENI
fonte
3
Eles estão querendo agora como definir a orientação padrão de um aplicativo, não como a tela pode ser girada.
kyle k
CTRL + f12 para emulador.
Preguiçoso