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.

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.


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.


@ 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);

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"] >  

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);

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"/>

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"

5

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

RequestedOrientation = Android.Content.PM.ScreenOrientation.Landscape;

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.


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" />


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.


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.


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);

0

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


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>

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.