¿Cómo deshabilitar el modo horizontal en Android?


933

¿Cómo puedo desactivar el modo horizontal para algunas de las vistas en mi aplicación de Android?


3
¿Está tratando esencialmente de deshabilitar la función de rotación automática? ¿Intenta establecer su orientación preferida en sus vistas de retrato? http://code.google.com/android/reference/android/R.styleable.html#AndroidManifestActivity_screenOrientation
adam

Respuestas:


1633

Agregar android:screenOrientation="portrait"a la actividad en el AndroidManifest.xml. Por ejemplo:

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

EDITAR: Dado que esta se ha convertido en una respuesta súper popular, me siento muy culpable ya que forzar el retrato rara vez es la solución correcta a los problemas a los que se aplica con frecuencia.
Las principales advertencias con retrato forzado:

  • Esto no lo exime de tener que pensar en los eventos del ciclo de vida de la actividad o de guardar / restaurar adecuadamente el estado. Además de la rotación de aplicaciones, hay muchas cosas que pueden desencadenar una actividad de destrucción / recreación, incluidas cosas inevitables como la multitarea. No hay atajos; aprender a usar paquetes yretainInstance fragmentos.
  • Tenga en cuenta que, a diferencia de la experiencia bastante uniforme de iPhone, hay algunos dispositivos donde el retrato no es la orientación claramente popular. Cuando los usuarios están en dispositivos con teclados de hardware o pads de juegos como el Nvidia Shield, en Chromebooks , en plegables o en Samsung DeX , forzar el retrato puede hacer que su experiencia de aplicación sea limitada o una gran molestia de usabilidad. Si su aplicación no tiene un argumento de UX fuerte que lo lleve a una experiencia negativa para soportar otras orientaciones, probablemente no debería forzar el panorama. Estoy hablando de cosas como "esta es una aplicación de caja registradora para un modelo específico de tableta que siempre se usa en una base de hardware fija".

Por lo tanto, la mayoría de las aplicaciones deberían dejar que los sensores del teléfono, el software y la configuración física tomen su propia decisión sobre cómo el usuario desea interactuar con su aplicación. Sin embargo, es posible que desee considerar algunos casos si no está satisfecho con el comportamiento predeterminado de sensororientación en su caso de uso:

  • Si su principal preocupación es que la orientación accidental cambie a mitad de la actividad, cree que los sensores y el software del dispositivo no funcionarán bien (por ejemplo, en un juego basado en la inclinación), considere apoyar el paisaje y el retrato, pero utilícelo nosensorpara la orientación. Esto fuerza el paisaje en la mayoría de las tabletas y el retrato en la mayoría de los teléfonos, pero aún así no lo recomendaría para la mayoría de las aplicaciones "normales" (a algunos usuarios simplemente les gusta escribir el teclado virtual horizontal en sus teléfonos, y muchos usuarios de tabletas leen en vertical) deberías dejarlos).
  • Si aún necesita forzar el retrato por algún motivo, sensorPortraitpuede ser mejor que portraitpara Android 2.3+; Esto permite un retrato al revés, que es bastante común en el uso de tabletas.

54
Es posible hacerlo para toda la aplicación. Mira esto stackoverflow.com/a/9784269/1300707
Liam George Betsworth

1
Noté que hay otro retrato: sensorPortait. ¿Cuál es la diferencia entre sensorPortait y retrato?
Jacky

1
Si lee los documentos de Google : "Orientación vertical, pero puede ser vertical o inversa según el sensor del dispositivo. Se agregó en el nivel 9 de la API". Entonces, es decir, "retrato, con el lado derecho hacia arriba o al revés, solo Android 2.3+".
Yoni Samlan

2
Como señalé en mi respuesta a continuación, para evitar varios problemas, "nosensor" es probablemente una mejor opción.
Mike Weir

1
Tengo que decir que no estoy de acuerdo. No todas las experiencias son compatibles con el modo horizontal en los teléfonos, por lo que debe dejar que el UX decida, no los sensores. Sin embargo, este no es el caso en las tabletas.
Renzo Tissoni

110

No estaba al tanto del AndroidManifest.xmlcambio de archivo hasta que leí esta publicación, así que en mis aplicaciones he usado esto en su lugar:

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);     //  Fixed Portrait orientation

99
Esto puede hacer que su actividad salte en la primera carga si el dispositivo no está en la orientación especificada.
Dori

Estaba usando este método, lo estaba llamando en OnCreate y luego leía datos de algunos archivos de activos. Si iniciara la aplicación con el dispositivo en orientación horizontal, rotaría, pero esto resultaría en una lectura errónea de esos activos de inicialización, por alguna extraña razón (tal vez debería haber esperado a que la rotación termine de alguna manera). Usar la alternativa xml no causó este problema.
Radu Simionescu

1
Eso puede ser un problema con la secuencia de inicio para los programas de Android. ¿Podría intentar mover el setRequestedOrientation () a onResume () ???
Rico

45

Agregue esto android:screenOrientation="portrait"en su archivo de manifiesto donde declara su actividad como esta

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

Si quieres hacerlo usando el código Java prueba

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

antes de llamar al setContentViewmétodo para su actividad enonCreate() .

Espero que esta ayuda sea fácilmente comprensible para todos ...


29

Muchas de las respuestas aquí sugieren su uso "portrait"en su archivo AndroidManifest.xml. Esto puede parecer una buena solución, pero como se señala en la documentación, está seleccionando dispositivos que solo pueden tener un paisaje. También está obligando a ciertos dispositivos (que funcionan mejor en paisaje) a ir en vertical, sin obtener la orientación adecuada.

Mi sugerencia es usar "nosensor"en su lugar. Esto hará que el dispositivo use su orientación preferida predeterminada, no bloqueará ninguna compra / descarga en Google Play y garantizará que el sensor no estropee su juego (NDK, en mi caso).


Dado que muchos votan a favor, me gustaría señalar que desde entonces he ido con otras respuestas que sugieren "retrato", ya que ciertos dispositivos oscuros responden de manera impredecible cuando quieren implementar la rotación de pantalla en la aplicación, que se convirtió en un requisito más adelante para mí. También dudo que cualquier aplicación con "retrato" quede bloqueada por cualquier configuración de Google Play.
Mike Weir

De hecho, Google Play filtra las aplicaciones de solo retrato en dispositivos de solo paisaje, vea la nota en esta página: developer.android.com/guide/topics/manifest/… ("el valor que declara permite el filtrado por servicios como Google Jugar ")
miracle2k

14

Si quieres configuraciones de usuario,

entonces recomendaría setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Puede cambiar la configuración desde un menú de configuración.

Exijo esto porque mis temporizadores deben corresponder a lo que está en la pantalla, y girar la pantalla destruirá la actividad actual.


14

Simplemente agregue Me gusta esta línea en su manifiesto

android: screenOrientation = "retrato"

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

9

Puede hacer esto para toda su aplicación sin tener que hacer que todas sus actividades extiendan una clase base común.

El truco es primero asegurarse de incluir una subclase de aplicación en su proyecto. En su onCreate (), llamado cuando su aplicación se inicia por primera vez, registra un objeto ActivityLifecycleCallbacks (nivel de API 14+) para recibir notificaciones de eventos del ciclo de vida de la actividad.

Esto le brinda la oportunidad de ejecutar su propio código cada vez que se inicia cualquier actividad en su aplicación (o se detiene, se reanuda o lo que sea). En este punto, puede llamar a setRequestedOrientation () en la actividad recién creada.

Y no olvide agregar la aplicación: nombre = ". MyApp" en su archivo de manifiesto.

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

7

Use esto en onCreate () de la Actividad

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

7

Deberías cambiar android:screenOrientation="sensorPortrait"en AndroidManifest.xml


6

Simplemente agregue este atributo en su etiqueta de actividad.

 android:screenOrientation="portrait"

6

Si no desea pasar por la molestia de agregar mejor orientación en cada entrada manifiesta de actividad, cree una clase BaseActivity (hereda 'Activity' o 'AppCompatActivity') que será heredada por cada actividad de su aplicación en lugar de 'Activity 'o' AppCompatActivity 'y simplemente agregue el siguiente código en su BaseActivity:

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

5

Agregue android:screenOrientation="portrait"a la actividad que desea deshabilitar el modo horizontal.


5

Si desea deshabilitar Landscape mode for your android app(o una sola actividad) todo lo que necesita hacer es agregar,

android:screenOrientation="portrait"a la etiqueta de actividad en el AndroidManifest.xmlarchivo.

Me gusta:

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

Otra forma, enfoque programático.

Si quieres hacer esto programáticamente es decir. usando el código Java Puede hacerlo agregando el siguiente código en la clase Java de la actividad que no desea que se muestre en modo horizontal.

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Espero que te ayude. Para más detalles puedes visitar aquí ingresa la descripción del enlace aquí


2
Dado que muchas respuestas dan consejos que contradicen los buenos consejos de @Phoenix y @Yoni, creo que una buena conclusión es reiterar lo que sugieren:android:screenOrientation="nosensor">
DSlomer64

1
@ DSlomer64 Sí. Si desea hacer frente a las tabletas, debe usar el valor del sensor nasal en lugar de retrato
IntelliJ Amiya

5

Cómo cambiar la orientación en algunas de las vistas

En lugar de bloquear la orientación de toda la actividad, puede usar esta clase para bloquear dinámicamente la orientación desde cualquiera de sus vistas de forma pragmática:

Haz tu vista Paisaje

OrientationUtils.lockOrientationLandscape(mActivity);

Haz tu vista Retrato

OrientationUtils.lockOrientationPortrait(mActivity);

Desbloquear orientación

OrientationUtils.unlockOrientation(mActivity);

Orientación Util Class

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

}

4

utilizar

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

4

Debe establecer la orientación de cada actividad.

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

4

agregar clase dentro del método oncreate ()

 setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

4

Si está utilizando Xamarin C #, algunas de estas soluciones no funcionarán. Aquí está la solución que encontré para trabajar.

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

La clase anterior funciona bien, similar a las otras soluciones, tampoco es aplicable a nivel mundial y debe colocarse en cada encabezado de actividad.


4

Puede forzar que su actividad particular permanezca siempre en modo vertical escribiendo esto en su manifiesto.xml

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

También puede forzar que su actividad permanezca en modo postrait escribiendo la siguiente línea en el método onCreate () de su actividad

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

}

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

3

Agregue a continuación elogio de su proyecto,

npm install

npm reacciono-nativo-orientación-armario

luego usa la clase de manifiesto como, React_Native (Your Project Folder) / 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>

¡Gracias!


2

En el <apphome>/platform/androiddirectorio creado AndroidManifest.xml(copiándolo del generado). Luego agregue android:screenOrientation=" portrait" a TODOS los elementos de actividad.


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 la Actividad en modo vertical u horizontal usando el atributo o android: screenOrientation.

si tenemos más de una actividad en mi programa, entonces usted tiene la libertad de restringir cualquiera de las actividades en cualquiera de los modos y nunca afectará a las otras que no desee.


2

Ya sea en clase manifiesta.

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

o programáticamente

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

Nota: debe llamar a este setContentViewmétodo antes de su actividad en onCreate().


2

Añadir android:screenOrientation="portrait"en AndroidManifest.xml archivo.

Por ejemplo :

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

1

Con la esperanza de ayudar a alguien más, todo lo que necesita es el siguiente atributo en ACTIVIDAD en AndroidManifest.xml:

android: configChanges = "orientación"

Entonces, nodo de actividad completa:

<activity android:name="Activity1" 
    android:icon="@drawable/icon" 
    android:label="App Name" 
    android:configChanges="orientation">

Quedan tantas respuestas, debe proporcionar más información, por qué uno debería usar la suya. Especialmente los documentos dicen que no está usando esta opción: "Nota: El uso de este atributo debe evitarse y usarse solo como último recurso. Lea Manejo de cambios de tiempo de ejecución para obtener más información sobre cómo manejar adecuadamente un reinicio debido a un cambio de configuración". developer.android.com/guide/topics/manifest/…
Murmel

1

En kotlin, lo mismo se puede lograr programáticamente usando a continuación

requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT

1

Funcionó para mí, intenta agregar este código en el archivo 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>

Hubiera sido una gran solución, ya que no tiene que configurar por actividad. Lamentablemente, no funciona en mi aplicación.
Myroslav Kolodii

1

Ponlo en tu manifiesto.

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

La orientación será vertical, pero si el teléfono del usuario está al revés, también mostrará la forma correcta. (Entonces su pantalla girará 180 grados).


El sistema ignora este atributo si la actividad se ejecuta en modo de ventanas múltiples .


0

si su actividad está relacionada con el primer estado de orientación del dispositivo, obtenga la orientación actual del dispositivo en el onCreatemétodo y luego corríjala para siempre:

        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);
        }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.