Como definir o aplicativo inteiro apenas no modo retrato?


201

Como faço para configurá-lo para que o aplicativo seja executado apenas no modo retrato? Quero que o modo paisagem seja desativado enquanto o aplicativo estiver em execução. Como faço isso programaticamente?

Respostas:


293

Para qualquer versão do Android

Do XML

Você pode especificar android:screenOrientation="portrait"para cada atividade no seu arquivo manifest.xml. Você não pode especificar esta opção na applicationtag.

Do Java

Outra opção é fazer isso programaticamente, por exemplo, em uma Activityclasse base:

@Override
public void onCreate(Bundle savedInstanceState) {
  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

Para Android 4+ (API 14+)

A última opção é fazer isso com os listeners do ciclo de vida da atividade, disponíveis apenas desde o Android 4.0 (API 14 ou superior). Tudo acontece em uma Applicationclasse personalizada :

@Override
public void onCreate() {
    super.onCreate();  
    registerActivityLifecycleCallbacks(new ActivityLifecycleAdapter() {
        @Override
        public void onActivityCreated(Activity a, Bundle savedInstanceState) {
            a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
    });
}

ActivityLifecycleAdapteré apenas uma classe auxiliar que você precisará criar, a qual será uma implementação vazia ActivityLifecycleCallbacks(para que você não precise substituir todos os métodos dessa interface quando precisar de um deles).


1
Não está funcionando. ele muda para o modo paisagem quando eu liguei o dispositivo. e mais coisa no código eu estou usando esses setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_SENSOR); instruções para a barra de progresso. há algum problema com estas instruções?
naresh 19/07/11

está funcionando. mais uma coisa não coloque acima de duas instruções na sua parte de codificação. significa que habilita o sensor para alterar a orientação da tela.
naresh 19/07/11

3
-1: o solicitante solicitou especificamente como fazê-lo // programaticamente // e para todo o aplicativo (o que me leva a acreditar que eles não querem fazê-lo para cada atividade individualmente).
jwir3

@ jwir3, eu discordo. "programação" não é apenas escrever código de código, mas também todos os metarquivos, recursos que você usa, solucionar as idiossincrasias do IDE etc. Essa é uma boa resposta, corrige o problema e o OP o marcou como correto. aparentemente uma resposta suficiente para a pergunta original.
9788 James

9
usando o método LifeCycleCallbacks, você terá um atraso no início das atividades quando segurar o dispositivo no (o que normalmente seria) no modo paisagem. Eu acho que é porque os dispositivos retornam brevemente ao modo paisagem entre as atividades e precisam de tempo para lidar com isso. Definir orientação no manifesto não tem esse efeito.
Anônimo

142

Sim, você pode fazer isso programaticamente e para todas as suas atividades, criando uma AbstractActivity que todas as suas atividades se estendem.

public abstract class AbstractActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
}

Essa atividade abstrata também pode ser usada para um menu global.


3
Nota: Acredito que essa ActivityInfo.SCREEN_ORIENTATION_NOSENSORdeve ser a melhor resposta, pois se destina a deixar o dispositivo no estado padrão, porque alguns dispositivos não têm a orientação Retrato. No entanto, 'nosensor' NÃO funciona para mim, então a resposta da @ arcone me representa.
David Manpearl

104

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 Applicationsubclasse no seu projeto. Por isso onCreate(), chamado quando o aplicativo é iniciado pela primeira vez, você registra um ActivityLifecycleCallbacksobjeto (nível de API 14+) para receber notificações de eventos do ciclo de vida da atividade.

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

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

            }

            ....

        });

    }
}

9
esta é a única resposta que aborda a questão. Uma linha para governar todos eles.
Samuel

2
* Uma classe para governar todos eles.
Jay Mayu

3
e nunca se esqueça de adicionar na raiz do aplicativo manifesto. android: name = ". MyApp"
Faisal Naseer

2
Essa abordagem chama o onCreate () da atividade duas vezes.
Sandeep R

3
O problema é que quando você segura o dispositivo horizontalmente e inicia uma nova atividade, ele aparece na orientação paisagem e depois gira para o retrato. Parece que a única boa maneira de bloquear o aplicativo completo na orientação retrato é marcar todas as atividades no Manifest.
Den

42

Você pode definir isso no seu arquivo de manifesto.

android:name=".your launching activity name"
android:screenOrientation="portrait"

e você também pode obter o mesmo escrevendo o código no seu arquivo de classe como:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

1
@ Naresh pls aceitar ans se u tem qualquer solução de acordo com sua necessidade ele vai correr o seu rating também
SRAM

24

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

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

25
Ele disse que APLICAÇÃO não é atividade.
Reinherd

10

Usar:

android:screenOrientation="portrait" 

Basta escrever esta linha no arquivo de manifesto do seu aplicativo em cada atividade que você deseja mostrar apenas no modo retrato.


8

Escreva isso no seu arquivo de manifesto, para todas as atividades:

android:screenOrientation="portrait" 

2

A partir do guia do desenvolvedor do Android:

"orientação" A orientação da tela mudou - o usuário girou o dispositivo. Nota: Se o seu aplicativo tiver como alvo a API nível 13 ou superior (conforme declarado pelos atributos minSdkVersion e targetSdkVersion), você também deverá declarar a configuração "screenSize", pois ela também muda quando um dispositivo alterna entre as orientações retrato e paisagem.

"screenSize" O tamanho da tela atual disponível foi alterado. Isso representa uma alteração no tamanho disponível no momento, em relação à proporção atual, e será alterada quando o usuário alternar entre paisagem e retrato. No entanto, se o seu aplicativo atingir a API de nível 12 ou inferior, sua atividade sempre lida com essa alteração de configuração (ela não reinicia sua atividade, mesmo quando executada em um dispositivo Android 3.2 ou superior). Adicionado no nível 13 da API.

Portanto, no arquivo AndroidManifest.xml, podemos colocar:

<activity
            android:name=".activities.role_activity.GeneralViewPagerActivity"
            android:label="@string/title_activity_general_view_pager"
            android:screenOrientation="portrait"
            android:configChanges="orientation|keyboardHidden|screenSize"
            >
        </activity> 

1

Adicionar <preference name="orientation" value="portrait" />abaixo <widget>no meu config.xml funcionou para mim.

(As outras soluções não funcionaram no meu dispositivo, foram substituídas durante a criação ou deram erros de descontinuação durante o processo de criação.)


Onde está o referido config.xml? A qual plataforma de desenvolvimento você está se referindo?
Tash Pemhiwa

1

no arquivo manifesto qual atividade você deseja usar em "retrato", você deve escrever esse código na marca de atividade

  android:screenOrientation="portrait" 

como isso

         android:icon="@drawable/icon"
        android:name="com.zemkoapps.hd.wallpaper.AndroidGridLayoutActivity" 
        android:screenOrientation="portrait" >

mas se você quiser tela na paisagem use esse código assim

android:screenOrientation="landscape"

1
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    //setting screen orientation locked so it will be acting as potrait
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
}

0

Se alguém estava se perguntando, como você poderia fazer isso em todo o aplicativo sem precisar fazer com que todas as suas atividades estendessem uma classe base comum no Kotlin , veja o exemplo abaixo:

class InteractiveStoryApplication: Application() {
override fun onCreate() {
    super.onCreate()
    registerActivityLifecycleCallbacks(object: ActivityLifecycleCallbacks {
        override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {
            activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
        }

        override fun onActivityPaused(activity: Activity?) {
        }

        override fun onActivityResumed(activity: Activity?) {
        }

        override fun onActivityDestroyed(activity: Activity?) {
        }

        override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {
        }

        override fun onActivityStarted(activity: Activity?) {
        }

        override fun onActivityStopped(activity: Activity?) {
        }
    })
}
}

e então você deve adicionar sua classe base comum no AndroidManifest da seguinte forma:

<application android:allowBackup="true"
android:name=".InteractiveStoryApplication"

0

Você pode fazer isso de duas maneiras.

  1. Adicionar android:screenOrientation="portrait" seu arquivo de manifesto à atividade correspondente
  2. Adicione setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); à sua atividade no método `onCreate ()

0

Semelhante à resposta de Graham Borland ... mas parece que você não precisa criar a classe Application se não quiser ... basta criar uma Atividade Base no seu projeto

public class BaseActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_base);
    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

}

E estenda essa classe em vez de AppCompatActivity onde você deseja usar o Modo Potrait

public class your_activity extends BaseActivity {}

0

Para usuários do Xamarin:

Se você estender todas as suas atividades a um BaseActivityBasta adicionar:

this.RequestedOrientation = ScreenOrientation.Portrait;

Isso resolverá o problema. Se você deseja que uma atividade específica esteja na paisagem, substitua-a por OnActivityCreated. Como:

this.Activity.RequestedOrientation = ScreenOrientation.Landscape;

-11

No seu manifesto, digite isto:

<activity
    android:screenOrientation="portrait"
    <!--- Rest of your application information ---!>
</activity>

6
Isso não adiciona nada de novo que as respostas de 3 anos ainda não tenham dito. Você pode excluí-lo. Se você decidir editar sua resposta para incluir mais informações que distingam sua resposta de outras pessoas, responda-me.
precisa

1
android: screenOrientation = "retrato" não pode ser adicionado a tag aplicativo, ele deve ir tag de atividade dentro
Hossein Amini
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.