Como desativar o modo paisagem no Android?

Respostas:

1633

Adicione android:screenOrientation="portrait"à atividade no AndroidManifest.xml. Por exemplo:

<activity android:name=".SomeActivity"
    android:label="@string/app_name"
    android:screenOrientation="portrait" />

EDIT: Como essa se tornou uma resposta super popular, me sinto muito culpado, pois forçar o retrato raramente é a solução certa para os problemas aos quais é frequentemente aplicado.
As principais advertências com retrato forçado:

  • Isso não o isenta de pensar em eventos do ciclo de vida da atividade ou em salvar / restaurar adequadamente o estado. Além da rotação de aplicativos, há muitas coisas que podem desencadear uma destruição / recreação de atividades, incluindo coisas inevitáveis, como multitarefa. Não há atalhos; Aprenda a usar pacotes e retainInstancefragmentos.
  • Lembre-se de que, diferentemente da experiência bastante uniforme do iPhone, existem alguns dispositivos em que o retrato não é a orientação claramente popular. Quando os usuários estão em dispositivos com teclados de hardware ou consoles de jogos no Nvidia Shield, em Chromebooks , em dobráveis ou no Samsung DeX , forçar o portrait pode fazer com que o seu aplicativo experimente uma limitação ou um enorme problema de usabilidade. Se o seu aplicativo não tiver um argumento UX forte que levaria a uma experiência negativa para apoiar outras orientações, você provavelmente não deve forçar o cenário. Estou falando de coisas como "este é um aplicativo de caixa registradora para um modelo específico de tablet sempre usado em um dock de hardware fixo".

Portanto, a maioria dos aplicativos deve apenas permitir que os sensores, o software e a configuração física do telefone tomem sua própria decisão sobre como o usuário deseja interagir com seu aplicativo. Em alguns casos, você ainda pode querer pensar se não estiver satisfeito com o comportamento padrão da sensororientação no seu caso de uso:

  • Se sua principal preocupação for a orientação acidental, as mudanças no meio da atividade, que você acha que os sensores e o software do dispositivo não conseguirão lidar bem (por exemplo, em um jogo baseado em inclinação), considere apoiar a paisagem e o retrato, mas use nosensora orientação. Isso força a paisagem na maioria dos tablets e o retrato na maioria dos telefones, mas eu ainda não recomendaria isso para a maioria dos aplicativos "normais" (alguns usuários gostam de digitar o teclado de paisagem em seus telefones e muitos usuários de tablets lêem em retrato - e você deve deixá-los).
  • Se você ainda precisa forçar o retrato por algum motivo, sensorPortraitpode ser melhor que portraitno Android 2.3 ou superior; isso permite retratos invertidos, o que é bastante comum no uso de tablets.
Yoni Samlan
fonte
54
É possível fazer isso para todo o aplicativo. Verifique isso stackoverflow.com/a/9784269/1300707 #
44770 Liam George Betsworth
1
Notei que há outro retrato: sensorPortait. Qual é a diferença entre sensorPortait e retrato?
Jacky
1
Se você ler os documentos do Google : "Orientação vertical, mas pode ser normal ou reversa, com base no sensor do dispositivo. Adicionado no nível 9 da API". Então - isto é - "retrato, lado direito para cima ou de cabeça para baixo, apenas Android 2.3 ou superior".
Yoni Samlan
2
Como observei na minha resposta abaixo - para contornar vários problemas, o "nosensor" é provavelmente uma opção melhor.
Mike Weir
1
Eu tenho que dizer que eu discordo. Nem todas as experiências são compatíveis com o modo paisagem nos telefones; portanto, você deve deixar o UX decidir, não os sensores. Este não é o caso em tablets.
Renzo Tissoni
110

Eu não estava ciente da AndroidManifest.xmltroca de arquivos até ler esta postagem, então, nos meus aplicativos, usei isso:

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);     //  Fixed Portrait orientation
Rico
fonte
9
isso pode fazer com que sua atividade salte na primeira carga se o dispositivo não estiver na orientação especificada.
Dori
Eu estava usando esse método, estava chamando-o no OnCreate e depois lia dados de alguns arquivos de ativos. Se eu iniciasse o aplicativo com o dispositivo na orientação paisagem, ele giraria, mas isso resultaria na leitura incorreta desses ativos de inicialização, por algum motivo estranho (talvez deva esperar a rotação terminar de alguma maneira). O uso da alternativa xml não causou esse problema.
Radu Simionescu
1
Esse pode ser um problema com a sequência de inicialização dos programas Android. Você pode tentar mover o setRequestedOrientation () para onResume () ???
Rich
45

Adicione isso android:screenOrientation="portrait"no seu arquivo de manifesto onde você declara sua atividade como esta

<activity android:name=".yourActivity"
    ....
    android:screenOrientation="portrait" />

Se você quiser usar o código java, tente

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

antes de chamar o setContentViewmétodo para sua atividade em onCreate().

Espero que esta ajuda e facilmente compreensível para todos ...

Deepak Swami
fonte
29

Muitas das respostas aqui estão sugerindo o uso "portrait"no seu arquivo AndroidManifest.xml. Pode parecer uma boa solução - mas, como observado na documentação, você seleciona dispositivos que podem ter apenas paisagem. Você também está forçando certos dispositivos (que funcionam melhor na paisagem) a serem retratados, sem obter a orientação adequada.

Minha sugestão é usar em seu "nosensor"lugar. Isso fará com que o dispositivo use sua orientação preferida padrão, não bloqueará compras / downloads no Google Play e garantirá que o sensor não atrapalhe seu jogo (NDK, no meu caso).

Mike Weir
fonte
Como muitos votam positivamente sobre isso, gostaria de salientar que, desde então, recebi outras respostas sugerindo "retrato", pois certos dispositivos obscuros realmente respondem imprevisivelmente ao querer implementar a rotação de tela no aplicativo, que se tornou um exigência mais tarde para mim. Também duvido que qualquer aplicativo com "retrato" seja bloqueado por qualquer configuração do Google Play.
Mike Weir
De fato, o Google Play filtra aplicativos somente retrato em dispositivos somente paisagem, consulte a observação nesta página: developer.android.com/guide/topics/manifest/… ("o valor que você declara permite a filtragem por serviços como o Google Play ")
miracle2k
14

Se você deseja configurações do usuário,

então eu recomendo setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Você pode alterar as configurações em um menu de configurações.

Exijo isso porque meus cronômetros devem corresponder ao que está na tela e girá-la destruirá a atividade atual.

Stephen
fonte
14

Basta adicionar como esta linha em seu manifesto

android: screenOrientation = "portrait"

<manifest
    package="com.example.speedtest"
    android:versionCode="1"
    android:versionName="1.0" >

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >


        <activity
            android:name="ComparisionActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait" >
        </activity>

    </application>

</manifest>   
Sunil Chaudhary
fonte
9

Você pode fazer isso para todo o aplicativo sem precisar fazer com que todas as suas atividades estendam uma classe base comum.

O truque é o primeiro a garantir que você inclua uma subclasse Aplicativo no seu projeto. No onCreate (), chamado quando o aplicativo é iniciado pela primeira vez, você registra um objeto ActivityLifecycleCallbacks (nível de API 14+) para receber notificações de eventos do ciclo de vida da atividade.

Isso dá a você a oportunidade de executar seu próprio código sempre que qualquer atividade em seu aplicativo for iniciada (ou parada, retomada ou qualquer outra coisa). Nesse ponto, você pode chamar setRequestedOrientation () na atividade recém-criada.

E não se esqueça de adicionar app: name = ". MyApp" no seu arquivo de manifesto.

class MyApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();  

        // register to be informed of activities starting up
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {

            @Override
            public void onActivityCreated(Activity activity, 
                                          Bundle savedInstanceState) {

                // new activity created; force its orientation to portrait
                activity.setRequestedOrientation(
                    ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }
            ....
        });
    }
}
Brinda Rathod
fonte
7

Use isso em onCreate () da atividade

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
Karan Datwani
fonte
7

Você deve alterar android:screenOrientation="sensorPortrait"no AndroidManifest.xml

vuhung3990
fonte
6

Basta adicionar este atributo na sua tag de atividade.

 android:screenOrientation="portrait"
Deepak Sharma
fonte
6

Se você não quiser passar pelo aborrecimento de adicionar orientação a cada entrada de manifesto da atividade, crie uma classe BaseActivity (herda 'Activity' ou 'AppCompatActivity') que será herdada por todas as atividades do seu aplicativo em vez de 'Activity 'ou' AppCompatActivity 'e adicione o seguinte trecho de código em sua BaseActivity:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    // rest of your code......
}
alquimista
fonte
5

Adicione android:screenOrientation="portrait"à atividade que você deseja desativar o modo paisagem.

Zhenxiao Hao
fonte
5

Se você deseja desativar Landscape mode for your android app(ou uma única atividade), tudo o que você precisa fazer é adicionar,

android:screenOrientation="portrait"para a tag de atividade no AndroidManifest.xmlarquivo.

Gostar:

<activity android:name="YourActivityName" 
    android:icon="@drawable/ic_launcher" 
    android:label="Your App Name" 
    android:screenOrientation="portrait">

Outra maneira, abordagem programática.

Se você quiser fazer isso programaticamente ou seja. usando código Java. Você pode fazer isso adicionando o código abaixo na classe Java da atividade que você não deseja exibir no modo paisagem.

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Espero que ajude você. Para obter mais detalhes, visite aqui, digite a descrição do link aqui

IntelliJ Amiya
fonte
2
Uma vez que tantas respostas dar conselhos que contradizem os bons conselhos de @Phoenix e @Yoni, eu acho que uma boa linha de fundo é reiterar o que eles sugerem:android:screenOrientation="nosensor">
DSlomer64
1
@ DSlomer64 Sim .Se você quiser lidar com dispositivos tablet, então você deve usar o valor nosensor vez retrato
IntelliJ Amiya
5

Como alterar a orientação em algumas das visualizações

Em vez de bloquear a orientação de toda a atividade, você pode usar esta classe para bloquear dinamicamente a orientação de qualquer ponto de vista pragmaticamente: -

Faça sua vista paisagem

OrientationUtils.lockOrientationLandscape(mActivity);

Faça sua vista Retrato

OrientationUtils.lockOrientationPortrait(mActivity);

Desbloquear orientação

OrientationUtils.unlockOrientation(mActivity);

Classe Util da Orientação

import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.os.Build;
import android.view.Surface;
import android.view.WindowManager;

/*  * This class is used to lock orientation of android app in nay android devices 
 */

public class OrientationUtils {
    private OrientationUtils() {
    }

    /** Locks the device window in landscape mode. */
    public static void lockOrientationLandscape(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
    }

    /** Locks the device window in portrait mode. */
    public static void lockOrientationPortrait(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }

    /** Locks the device window in actual screen mode. */
    public static void lockOrientation(Activity activity) {
        final int orientation = activity.getResources().getConfiguration().orientation;
        final int rotation = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay()
                .getRotation();

        // Copied from Android docs, since we don't have these values in Froyo
        // 2.2
        int SCREEN_ORIENTATION_REVERSE_LANDSCAPE = 8;
        int SCREEN_ORIENTATION_REVERSE_PORTRAIT = 9;

        // Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO
        if (!(Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO)) {
            SCREEN_ORIENTATION_REVERSE_LANDSCAPE = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
            SCREEN_ORIENTATION_REVERSE_PORTRAIT = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
        }

        if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90) {
            if (orientation == Configuration.ORIENTATION_PORTRAIT) {
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            } else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            }
        } else if (rotation == Surface.ROTATION_180 || rotation == Surface.ROTATION_270) {
            if (orientation == Configuration.ORIENTATION_PORTRAIT) {
                activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_PORTRAIT);
            } else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
                activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
            }
        }
    }

    /** Unlocks the device window in user defined screen mode. */
    public static void unlockOrientation(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
    }

}
Hitesh Sahu
fonte
4

usar

android:configChanges="keyboardHidden|orientation"
android:screenOrientation="portrait" 
Swayam
fonte
4

Você deve definir a orientação de cada atividade.

<activity
                android:name="com.example.SplashScreen2"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>
            <activity
                android:name="com.example.Registration"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>
            <activity
                android:name="com.example.Verification"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>
            <activity
                android:name="com.example.WelcomeAlmostDone"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>
            <activity
                android:name="com.example.PasswordRegistration"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>
Akshay Paliwal
fonte
4

adicionar classe dentro do método oncreate ()

 setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
Kumar
fonte
4

Se você estiver usando o Xamarin C #, algumas dessas soluções não funcionarão. Aqui está a solução que eu encontrei para trabalhar.

[Activity(MainLauncher = true, Icon = "@drawable/icon", ScreenOrientation = ScreenOrientation.Portrait)]

Acima da classe funciona bem, semelhante a outras soluções, também não é aplicável globalmente e precisa ser colocado em cada cabeçalho de atividade.

Derek Kelly
fonte
4

Você pode forçar sua atividade específica a permanecer sempre no modo retrato escrevendo isso em seu manifest.xml

 <activity android:name=".MainActivity"
        android:screenOrientation="portrait"></activity>

Você também pode forçar sua atividade a permanecer no modo pós-escrito, escrevendo a seguinte linha no método onCreate () da sua atividade

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_layout);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

}
Mansuu ....
fonte
3
<android . . . >
    . . .
    <manifest . . . >
        . . .
        <application>
            <activity android:name=".MyActivity" 
                android:screenOrientation="portrait" 
                android:configChanges="keyboardHidden|orientation">
            </activity>
        </application>
    </manifest>
</android>

fonte
3

Adicione abaixo elogie seu projeto,

instalação npm

npm i reage-nativo-orientação-armário

então você usa a classe manifest, como React_Native (sua pasta do projeto) / android / app / src / main / AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

<application
  android:name=".MainApplication"
  android:label="@string/app_name"
  android:icon="@mipmap/ic_launcher"
  android:allowBackup="false"
  android:theme="@style/AppTheme">
  <activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:screenOrientation="landscape"
    android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
    android:windowSoftInputMode="adjustResize">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
  </activity>
  <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
</application>

Obrigado!

shanmuga Rajan
fonte
2

No <apphome>/platform/androiddiretório criado AndroidManifest.xml(copiando-o do gerado). Em seguida, adicione android:screenOrientation=" portrait" a TODOS os elementos da atividade.

user811985
fonte
2
 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="in.co.nurture.bajajfinserv">
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>


    <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="portrait">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

podemos restringir a atividade no modo retrato ou paisagem usando o atributo ou android: screenOrientation.

se tivermos mais de uma atividade no meu programa, você terá liberdade para restringir qualquer atividade em qualquer modo e nunca afetará os outros que você não deseja.

Amit Kumar
fonte
2

Ou na classe manifesto.

<activity android:name=".yourActivity"
    ....
    android:screenOrientation="portrait" />

ou programaticamente

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

Nota: você deve chamar isso antes do setContentViewmétodo para sua atividade em onCreate().

Khemraj
fonte
2

Adicionar android:screenOrientation="portrait"no AndroidManifest.xml arquivo.

Por exemplo :

<activity android:name=".MapScreen" 
 android:screenOrientation="portrait"></activity>
Pradeep Sodhi
fonte
1

Na esperança de ajudar outra pessoa, basta o seguinte atributo no ACTIVITY no AndroidManifest.xml:

android: configChanges = "orientação"

Portanto, nó de atividade completo:

<activity android:name="Activity1" 
    android:icon="@drawable/icon" 
    android:label="App Name" 
    android:configChanges="orientation">
Ben
fonte
Ainda existem muitas respostas, você deve fornecer mais informações, por que usar a sua. Especialmente, os documentos dizem que não está usando esta opção: "Nota: O uso deste atributo deve ser evitado e usado apenas como último recurso. Leia Manipulando alterações de tempo de execução para obter mais informações sobre como lidar adequadamente com uma reinicialização devido a uma alteração na configuração." developer.android.com/guide/topics/manifest/…
Murmel
1

No kotlin, o mesmo pode ser conseguido através de programação usando abaixo

requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
osleonard
fonte
1

Funcionou para mim. Tente adicionar este código no arquivo AndroidManifest

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme">
        ....
        ....
        </application>
Arvina Kori
fonte
Eu teria sido uma ótima solução, pois você não precisa definir por atividade. Infelizmente, não funciona no meu aplicativo.
Myroslav Kolodii
1

Coloque no seu manifesto.

<activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:screenOrientation="sensorPortrait" />

A orientação será vertical, mas se o telefone do usuário estiver de cabeça para baixo, ele também mostrará a maneira correta. (Portanto, sua tela girará 180 graus).


O sistema ignorará esse atributo se a atividade estiver em execução no modo de várias janelas .

Marci
fonte
0

se sua atividade estiver relacionada ao primeiro estado de orientação do dispositivo, obtenha a orientação atual do dispositivo no onCreatemétodo e corrija-a para sempre:

        int deviceRotation = ((WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getOrientation();

        if(deviceRotation == Surface.ROTATION_0) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
        else if(deviceRotation == Surface.ROTATION_180)
        {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
        }
        else if(deviceRotation == Surface.ROTATION_90)
        {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
        else if(deviceRotation == Surface.ROTATION_270)
        {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
        }
Hamid
fonte