Forçar o modo de orientação "retrato"

298

Estou tentando forçar o modo "retrato" para o meu aplicativo porque meu aplicativo não foi projetado para o modo "paisagem".

Depois de ler alguns fóruns, adicionei estas linhas no meu arquivo de manifesto:

<application 
  android:debuggable="true"
  android:icon="@drawable/icon" 
  android:label="@string/app_name"
  android:screenOrientation="portrait">

Mas não funciona no meu dispositivo (HTC Desire). Ele muda de "retrato" para "paisagem", ignorando as linhas do arquivo de manifesto.

Depois de ler mais fóruns, tentei adicionar isso ao meu arquivo de manifesto:

<application 
  android:debuggable="true"
  android:icon="@drawable/icon" 
  android:label="@string/app_name"
  android:configChanges="orientation"       
  android:screenOrientation="portrait">

e esta função na minha classe de atividade:

public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

Mas, novamente, sem sorte.

thomaus
fonte

Respostas:

531

Não aplique a orientação ao elemento do aplicativo ; em vez disso, você deve aplicar o atributo ao elemento da atividade e também deve definir configChangescomo indicado abaixo.

Exemplo:

<activity
   android:screenOrientation="portrait"
   android:configChanges="orientation|keyboardHidden">
</activity>

Isso é aplicado no arquivo de manifesto AndroidManifest.xml.

C0deAttack
fonte
26
Para que servem as configurações?
Dror
71
@Orchestrator, configChanges significa que a alteração na configuração é tratada pela própria atividade. Sem ela, a atividade será reiniciada se houver uma mudança de orientação. Você pode perguntar, se você especificou que a orientação é "retrato", como isso mudaria? Pode mudar se você iniciar outra atividade que altere a orientação e, em seguida, essa nova atividade sairá, retornando você à sua atividade. Por exemplo, a intenção de captura de imagem padrão no Samsung Galaxy S3 faz isso em determinadas orientações.
Gordon McCreight
2
@GordonMcCreight, você pode explicar isso com um exemplo real: "Você pode perguntar, se você especificou que a orientação é" retrato ", como isso mudaria? Ele pode mudar se você iniciar outra atividade que altere a orientação e, em seguida, que nova atividade é encerrada, retornando à sua atividade ".
Tushar Pandey '
3
Claro, @TusharPandey. Se bem me lembro, o único lugar em que isso nos causou pesar foi quando nossa atividade lançou a intenção de captura de imagem padrão no Samsung Galaxy S3. Basicamente, só queríamos tirar uma foto e obter os resultados. No entanto, quando a intenção da câmera retornou, causou uma mudança de orientação que varreu o estado em nossa atividade, pois não acreditávamos que precisávamos nos proteger contra isso (já que todo o nosso aplicativo estava apenas na orientação "retrato"). Como e por que o Galaxy S3 faz isso está além do meu entendimento (reconhecidamente limitado).
Gordon McCreight 02/02
8
Por que o "keyboardHidden" está incluído?
Gonzobrains 30/05
24

Observe que

android:screenOrientation="portrait"     
android:configChanges="orientation|keyboardHidden"

é adicionado no arquivo de manifesto - onde a atividade é definida.

Ponteiro nulo
fonte
13

Eu acho que android:screenOrientation="portrait"pode ser usado para atividades individuais. Então use esse atributo na <activity>tag como:

<activity android:name=".<Activity Name>"
    android:label="@string/app_name" 
    android:screenOrientation="portrait">
   ...         
</activity>
Pinki
fonte
13

Se você estiver tendo muitas atividades como a minha, no seu aplicativo ou se não quiser inserir o código para cada marca de atividade no manifesto, poderá fazê-lo.

na sua classe Application Base, você receberá um retorno de chamada do ciclo de vida

Então, basicamente, o que acontece em cada atividade ao criar o na criação na Classe de Aplicativo é acionado aqui é o código.

public class MyApplication extends Application{

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

  registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle bundle) {
                activity.setRequestedOrientation(
                        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


// for each activity this function is called and so it is set to portrait mode


            }

            @Override
            public void onActivityStarted(Activity activity) {

            }

            @Override
            public void onActivityResumed(Activity activity) {

            }

            @Override
            public void onActivityPaused(Activity activity) {

            }

            @Override
            public void onActivityStopped(Activity activity) {

            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {

            }

            @Override
            public void onActivityDestroyed(Activity activity) {

            }
        });
}

Eu espero que isso ajude.

Muneef M
fonte
1
Resposta eficiente! essa deve ser a resposta correta, especialmente para aqueles que estão desenvolvendo aplicativos complexos que dependem muito de um grande número de atividades.
FEBRYAN ASA PERDANA
10

Defina o modo retrato ou paisagem , adicione linhas respectivamente.

Importar abaixo da linha:

import android.content.pm.ActivityInfo;

Adicionar linha abaixo logo acima setContentView(R.layout.activity_main);

Para Retrato :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//Set Portrait

Para Landscap :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//Set Landscape

Isso definitivamente vai funcionar.

Parth Patel
fonte
1
Esta falha com Android 9 em alguns dispositivos - transição de rotação da tela é visível para um momento breve, mesmo se você só usa RETRATO
Igor Wojda
Você pode por favor especificar a informação dispositivo no qual você enfrentar este, se possível
Parth Patel
4

De acordo com a documentação do Android, você também deve incluir frequentemente screenSizecomo uma possível alteração na configuração.

android:configChanges="orientation|screenSize"

Se seu aplicativo tiver como alvo a API nível 13 ou superior (conforme declarado pelos atributos minSdkVersion e targetSdkVersion), você também deve declarar a configuração "screenSize", pois ela também muda quando um dispositivo alterna entre as orientações retrato e paisagem.

Além disso, se todos incluem valor keyboardHiddenem seus exemplos, você não deveria então também considerar locale, mcc, fontScale, keyboarde outros? ..

Martynas
fonte
3

Eu tinha essa linha no meu AndroidManifest.xml

<activity 
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
    android:label="@string/app_name" android:name="Project Name"
    android:theme="@android:style/Theme.Black.NoTitleBar">

Que mudei para (acabei de adicionar android:screenOrientation="portrait")

<activity 
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
    android:label="@string/app_name" android:name="Project Name"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Black.NoTitleBar">

Isso consertou as coisas para mim.

Ian Jamieson
fonte
2

Algo para complementar: atualizei um aplicativo recentemente, o anterior estava funcionando nos modos paisagem e retrato e quero que a versão atualizada funcione no modo retrato, então adicionei

android:screenOrientation="portrait"

para a atividade correspondente e ela falhou quando testei a atualização. Então eu adicionei

android:configChanges="orientation|keyboardHidden"

também e funciona.

user2819453
fonte
1
Se essa não for uma resposta para a pergunta, talvez seja possível adicioná-la, pois o comentário ajudaria.
JPReddy
Verifique se você o adicionou à atividade que não está para o bloco de aplicativos
Waran- 27/04/19
1

Eu acho que você deseja adicionar android:configChanges="orientation|keyboardHidden"à sua atividade? Caso contrário, a atividade será reiniciada na mudança de configuração. O onConfigurationChangednão seria chamado então, apenas oonCreate

Nanne
fonte
1

Se você deseja oferecer suporte a orientações debuge releasecompilações diferentes, escreva-o (consulte https://developer.android.com/studio/build/gradle-tips#share-properties-with-the-manifest ).

Em build.gradlede sua appgravação pasta:

android {
    ...
    buildTypes {
        debug {
            applicationIdSuffix '.debug'
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // Creates a placeholder property to use in the manifest.
            manifestPlaceholders = [orientation: "fullSensor"]
        }
        release {
            debuggable true
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // Creates a placeholder property to use in the manifest.
            manifestPlaceholders = [orientation: "portrait"]
        }
    }
}

Então, AndroidManifestvocê pode usar esta variável "orientação" em qualquer Activity:

<activity
    android:name=".LoginActivity"
    android:screenOrientation="${orientation}" />

Você pode adicionar android:configChanges:

manifestPlaceholders = [configChanges: "", orientation: "fullSensor"]na depuração e manifestPlaceholders = [configChanges: "keyboardHidden|orientation|screenSize", orientation: "portrait"]na liberação,

<activity
    android:name=".LoginActivity"
    android:configChanges="${configChanges}"
    android:screenOrientation="${orientation}" />
CoolMind
fonte
-8

Resposta curta: não faça isso.

Redesenhe seu aplicativo para que ele possa ser executado nos modos retrato e paisagem. Não existe uma interface do usuário que não possa ser projetada para funcionar em retrato e paisagem; apenas desenvolvedores preguiçosos ou sem imaginação.

A razão pela qual é bastante simples. Você deseja que seu aplicativo seja utilizável pelo maior público possível em tantos dispositivos diferentes quanto possível. Ao forçar uma orientação de tela específica, você impede que seu aplicativo seja executado (utilizável) em dispositivos que não suportam essa orientação e frustra e aliena clientes em potencial que preferem uma orientação diferente.

Exemplo: você cria seu aplicativo para forçar o modo retrato. Um cliente baixa o aplicativo em um dispositivo 2 em 1, usado predominantemente no modo paisagem.
Consequência 1: seu aplicativo não pode ser usado ou seu cliente é forçado a desencaixar o dispositivo, girá-lo e usá-lo em uma orientação que não seja familiar ou confortável para ele.
Consequência 2: o cliente fica frustrado com o design não intuitivo do seu aplicativo e encontra uma alternativa ou descarta o aplicativo completamente.

Estou lutando contra isso com um aplicativo no momento e, como consumidor e desenvolvedor, odeio isso. Por mais útil que o aplicativo seja, por mais fantástico que sejam os recursos que ele oferece, eu odeio o aplicativo, porque ele me obriga a usar uma orientação que é contrária a qualquer outra maneira de usar o dispositivo.

Você não quer que seus clientes odeiem seu aplicativo.


Sei que isso não responde diretamente à pergunta, então quero explicá-la com mais detalhes para quem está curioso.

Há uma tendência para os desenvolvedores serem realmente bons em escrever código e realmente terríveis em design. Essa pergunta, embora pareça uma questão de código e o solicitante certamente sinta que é uma questão de código, é realmente uma questão de design.

A questão é realmente "Devo bloquear a orientação da tela no meu aplicativo?" O solicitante optou por projetar a interface do usuário para funcionar e ter uma boa aparência apenas no modo retrato. Suspeito que foi para economizar tempo de desenvolvimento ou porque o fluxo de trabalho do aplicativo é particularmente propício a um layout de retrato (comum para jogos para celular). Mas esses motivos negligenciam todos os fatores reais importantes que motivam o design adequado.

  1. Engajamento do cliente - você deseja que seus clientes se sintam atraídos pelo seu aplicativo, e não empurrados para fora dele. O aplicativo deve fazer a transição sem problemas do que o cliente estava fazendo antes de abrir o aplicativo. (Esse é o motivo pelo qual a maioria das plataformas possui princípios de design consistentes, portanto, a maioria dos aplicativos é mais ou menos parecida, embora não seja necessário.)

  2. Resposta do cliente - você deseja que seus clientes reajam positivamente ao seu aplicativo. Eles devem gostar de usá-lo. Mesmo se for um aplicativo de folha de pagamento para o trabalho, deve ser um prazer para eles abri-lo e entrar. O aplicativo deve economizar tempo de seus clientes e reduzir a frustração por alternativas. Aplicativos que incomodam os usuários criam ressentimentos contra seu aplicativo, que se tornam ressentidos contra sua marca.

  3. Conversão de clientes - você deseja que seus clientes possam passar rápida e facilmente da navegação para a interação. Esse é o objetivo final de qualquer aplicativo: converter impressões em receita. Aplicativos que não geram receita são uma perda de tempo para criar, do ponto de vista comercial.

Uma interface do usuário mal projetada reduz o envolvimento e a resposta do cliente, o que resulta em menor receita. Em um mundo centralizado em dispositivos móveis (e particularmente no assunto dos modos de exibição retrato / paisagem), isso explica por que o web design responsivo é tão importante. O Walmart Canadá introduziu o design responsivo em seu site em novembro de 2013 e obteve um aumento de 20% na conversão de clientes. O'Neill Roupa implementado web design responsivo e receitas de clientes que utilizam dispositivos iOS aumentou 101,25% e 591,42% de clientes usando dispositivos Android .

Também há uma tendência para os desenvolvedores se concentrarem intensamente na implementação de uma solução específica (como bloquear a orientação da tela), e a maioria dos desenvolvedores deste site ficará muito feliz em ajudar a implementar essa solução, sem questionar se isso é o melhor. solução para o problema.

Bloquear a orientação da tela é o equivalente ao design da interface do usuário da implementação de um loop do while. Você está realmente certo de que quer fazer isso dessa maneira, ou se há uma alternativa melhor?

Não force seu aplicativo a entrar em um único modo de exibição. Invista tempo e esforço extras para torná-lo responsivo.

Thomas
fonte
2
Entendo e concordo com você sobre o fato de ser uma interface do usuário mal projetada. Mas isso não muda o fato de que você PODE PRECISAR fazer isso, e mesmo assim a estrutura deve ter esses recursos, em geral. Você nunca sabe como serão os aplicativos futuros e precisará fazer, portanto a pergunta ainda é válida.
Z. Khullah 22/08/19
1
Você não está errado. Acho que minha resposta foi parcialmente alimentada pela frustração que tenho com alguns aplicativos que fazem isso desnecessariamente e isso arruina completamente a experiência. Eu direi que o número de casos legítimos para bloquear o modo de exibição é infinitamente pequeno (e ainda é factível e preferível, mas não dentro do orçamento). Isso traz à mente outros problemas; com a codificação se tornando tão fácil quanto tem, existem muitos desenvolvedores amadores que escrevem aplicativos porque conhecem o código, mas sem aprender a fazer interface do usuário ou design, ou mesmo práticas recomendadas básicas (aplicativos Java instalados em \ AppData - EWWWW).
Thomas
1
Estou construindo um aplicativo de realidade virtual. A orientação DEVE SER paisagem para os óculos fazerem sua mágica. Esse é um exemplo de interface do usuário que não pode ser projetada para funcionar em retrato e paisagem. Os jogos também podem ter que forçar uma certa orientação. Aposto que há toneladas de casos legítimos.
Raslanove
1
Embora o StackExchange exista para responder perguntas específicas, as respostas devem ser escritas para serem aplicadas da maneira mais geral possível, para que essas respostas sejam úteis para outras pessoas. O desenvolvimento é muito mais do que apenas escrever código e a razão pela qual existem tantos aplicativos indesejados no mundo é porque muitos desenvolvedores esquecem - ou nunca aprendem - esse importante princípio. Pessoalmente, eu acrescentaria que, se você está fazendo VR em um telefone, está fazendo VR errado - mas o custo empurrou a demanda por VR para plataformas que nunca deveriam suportá-lo.
Thomas
1
Não discordo desta resposta, mas está respondendo a uma pergunta que não foi feita.
bmovement